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':表示做業當即運行,運行完退出,不會重複運行