一、預存程序
用途
用於執行某項操作,命名的 PL/SQL 塊,能夠接受傳遞的參數,能夠被調用。
簡述
命名的PL/SQL塊
能夠接受參數
能夠被重複調用
用於執行某項操作
儲存在資料庫中
二、過程的參數
有三種
1、in 模式
預設模式
可以傳遞常量或變數
在過程內部,不能賦常量
允許有預設值,如:p_id in number default 7369
2、out 模式
調用時,必須用變數,但會忽略變數值
調用結束後,對變數賦值
3、in out 模式
傳入參數值,並可以返回改變的值
備忘:
不能限制參數中資料類型的大小
out和in out 參數不允許有預設值
四、程式碼範例
1、in 模式
參數模式說明: in , 輸入模式,預設是in . 表示接收值,在過程代碼中不能再賦值.
--in 模式create or replace procedure param_test_in (num int ,num2 in int)asbegin --num := 12; --in模式的參數,接收到值之後變為常量,不能賦值. dbms_output.put_line(num+num2);end;declare n1 int; n2 int;begin param_test_in(10,20); --給in模式參數傳常量值. n1:=200; n2:=300; param_test_in(n1,n2); --給in模式參數傳變數.end;
2、out 模式
參數模式說明:out , 輸出模式. 表示輸出值,在過程代碼中,可以重新賦值.調用時,必須用變數調用.
--in + out 模式 /* 寫一個預存程序,包含兩個參數,p_sal為薪水參數(傳入 參數),p_mes為資訊參數(傳出參數)當傳入的薪水大於所 有薪水平均值時,將‘薪水太高了’資訊傳給資訊參數;否則傳遞 ‘薪水正常’。*/create or replace procedure sal_proc( p_sal in emp.sal%type, p_mes out varchar )is v_sal emp.sal%type ;begin select avg(sal) into v_sal from emp ; if p_sal > v_sal then p_mes:='薪水太高了'; else p_mes:='薪水正常'; end if;end;
3、in out 模式
1)必須要用變數調用
2)過程可以擷取到輸入變數的值,
3)過程中變數可重新賦值.
4)過程執行完,也會輸出值給調用時的變數.
-in + out + in out 模式CREATE OR REPLACE PROCEDURE raise_sal(p_id IN emp.empno%type, p_name OUT varchar2, p_sal IN OUT number)ISBEGIN UPDATE emp SET sal = sal + p_sal WHERE empno = p_id; SELECT sal,ename into p_sal,p_name FROM emp WHERE empno = p_id;END raise_sal;DECLARE v_sal emp.sal%type := 500; v_name emp.ename%type;BEGIN raise_sal(7369,v_name,v_sal); dbms_output.put_line('僱員:'||v_name||'現在的薪水是 '||v_sal);END;
4、其他常用語句
--命令列中,查看過程的錯誤.show errors PROCEDURE sal_proc;--刪除過程drop procedure sal_proc;--授予許可權 --1)直接授權grant select on emp to system; -- 表名 emp,使用者名稱 system --2)間接授權grant execute on sal_proc to system; --預存程序 sal_proc,使用者名稱 system--查看使用者物件中的procedure和function中的對象名、物件類型 和 狀態SELECT object_name, object_type,statusFROM user_objectsWHERE object_type in ('PROCEDURE','FUNCTION')ORDER BY object_name;--查看類型為【過程】的原始碼,大寫SELECT *FROM user_sourceWHERE type = 'PROCEDURE';