Oracle的PL/SQL編程前奏之基礎技能實戰六(包)

                                                                                            Oracle的PL/SQL編程前奏之基礎技能實戰六                                     
sql

一>編寫包規範及包體,包體中包含存儲過程,函數的實現。編程

create or replace package emp_action_pkg is
       v_deptno number(3):=20;
       -----定義一個增長員工的過程
       procedure newdept(
                 p_deptno   dept.deptno%Type,-----部門編號
                 p_dname    dept.dname%type, -----部門名稱
                 p_loc      dept.loc%type    -----位置
         );        
       function getraisedsalary(p_empno emp.empno%type)
         return number;
end;

總結:1>%type定義了與dept表中deptno,dname,loc列相同的類型。app

2>定義了包規範。ide


 

create or replace package  body emp_action_pkg is
      ----公開,實現包規範中定義的newdept過程
        procedure newdept(
                 p_deptno   dept.deptno%Type,-----部門編號
                 p_dname    dept.dname%type, -----部門名稱
                 p_loc      dept.loc%type    -----位置
         )
         as
                 v_deptcount number;-----保存是否存在員工編號
         begin
                 select count(*) into v_deptcount from dept where deptno=p_deptno;---查詢在dept表中是否存在部門編號
                 if v_deptcount>0 then
                    raise_application_error('-20002','出現了相同的員工記錄');
                 end if;
                 insert into dept(deptno,dname,loc) values(p_deptno,p_dname,p_loc);---插入記錄
         end;
         
      ----公開,實現包規範中定義的getraisedsalary函數
      function getraisedsalary(p_empno emp.empno%type)
        return number
      is
        v_job emp.job%type;---職位變量
        v_sal emp.sal%type;---薪資變量
        v_salaryratio number(10,2);---調薪比例
      begin
        select job,sal into v_job,v_sal from emp where empno=p_empno;
        case v_job
          when '職員' then
               v_salaryratio:=1.09;
          when '銷售人員' then
               v_salaryratio:=1.11;
          when '經理' then
                v_salaryratio:=1.18; 
          else
                 v_salaryratio:=1; 
        end case;
        if v_salaryratio<>1 then        ----若是有調薪的可能
          return round(v_sal*v_salaryratio,2);----返回調薪後的薪資
        else
          return v_sal; 
        end if;                         ----不然不返回薪資
      exception
        when no_data_found then
          return 0;         -----若是沒有找到員工記錄,返回0
      end;
  ---私有,該函數在包規範中並不存在,只能在包體內被引用
      function checkdeptno(p_deptno dept.deptno%type)
        return number
      as
        v_counter   number(2);
      begin
        select count(*) into v_counter from dept where deptno=p_deptno;
        return v_counter;
      end;   
end;

總結:1>對賦值後的變量進行case判斷:函數

case v_job 
when '職員' then
         v_salaryratio:=1.09;
    when '銷售人員' then
         v_salaryratio:=1.11;
    when '經理' then
         v_salaryratio:=1.18; 
   else
         v_salaryratio:=1; 
end case;

2>編寫包體實現包規範spa

3>checkdeptno在包規範中不存在,只能在包體內被引用。字符串




begin
  emp_action_pkg.v_deptno:=30;
  dbms_output.put_line(emp_action_pkg.getraisedsalary(7369));
end;
begin
  emp_action_pkg.v_deptno:=50;
  emp_action_pkg.newdept(45,'採納部','佛山');
end;
begin
  dbms_output.put_line(emp_action_pkg.v_deptno);
end;

總結:1>編寫三個匿名塊調用包組件。get


二>使用DBMS_JOB建立做業(用於分析數據表)。it

1>運用dbms_job包建立做業做業,做業執行的存儲過程爲analyze_object
DECLARE
   v_jobno   NUMBER;
BEGIN
   DBMS_JOB.submit
        (v_jobno,                             --做業編號
          --做業執行的存儲過程
         'DBMS_DDL.analyze_object(''TABLE'',''SCOTT'',''EMP'',''COMPUTE'');',
         --以sysdate做爲下一次執行的日期         
         SYSDATE,
         --Interval屬性執行的時間間隔,表示24小時。
         'SYSDATE+1'
        );  
   DBMS_OUTPUT.put_line('獲取的做業編號爲:'||v_jobno);  --輸出做業編號
   COMMIT;
END;

2>查詢建立的做業io

select job,next_date,next_sec,interval,what from user_jobs;

總結:

A>interval參數是varchar2字符串類型,不是一個日期或天或分鐘的數字,能夠傳遞想傳遞的字符串

‘sysdate+1’:表示下一天的當前時間

'trunc(sysdate)+1':表示下一天的午時,即12點

'trunc(sysdate)+17/24':在天天下午5點運行

'null':表示做業當即運行,運行完退出,不會重複運行

相關文章
相關標籤/搜索