三種參數模式:in,out,in out
1.in參數(只讀參數)
▪當過程被調用時,實參的值將傳入該過程
▪形參的值不能被修改,只能被存儲過程讀取,也就是說形參不能作為賦值目標
▪默認的參數模式使In參數
▪當過程結束時,實參的值不會改變
2.out參數(只寫參數)
▪當過程被調用時,實參的值將忽略不計,不能傳給形參
▪形參的作用相當於沒有被初始化的PL/SQL變量,其值為NULL,形參的值可以在過程中被修改
▪實參必須是變量
▪當過程結束時將形參的內容賦給實參
SQL> create procedure count_emp 2 (v_deptno dept.deptno%type,v_count out number) 3 as 4 begin 5 select count(*) into v_count from emp group by deptno having deptno=v_deptno; 6 dbms_output.put_line('部門'||v_deptno||'有'||v_count||'個雇員'); 7 end count_emp; 8 / 過程已創建。
調用方式:
方法1: SQL> variable v_count number; SQL> exec count_emp(10,:v_count); 部門10有3個雇員 PL/SQL 過程已成功完成。 方法2: SQL> declare 2 v_count number; 3 begin 4 count_emp(10,v_count); 5 end; 6 / 部門10有3個雇員 PL/SQL 過程已成功完成。
3.in out參數(可讀寫參數)
▪形參可以讀取,也可以寫入,過程調用時,將實參的值傳入給形參,過程結束后,又將形參的值賦給實參
▪形參和實參都必須是變量
4.形參不需要對數據類型進行約束,約束來自於實參
5.形參的默認值,只有In參數有默認值
SQL> create or replace procedure p_emp 2 (v_id in number default 4) 3 as 4 begin 5 insert into emp(ename,empno) values('林慧',v_id); 6 end; 7 / 過程已創建。
SQL> create or replace procedure p_emp 2 (v_id out number default 4) 3 as 4 begin 5 insert into emp(ename,empno) values('林慧',v_id); 6 end; 7 / 警告: 創建的過程帶有編譯錯誤。 SQL> show error PROCEDURE P_EMP 出現錯誤: LINE/COL ERROR -------- ----------------------------------------------------------------- 2/2 PLS-00230: OUT 和 IN OUT 的形參不能有默認表達式
6.實參和形參的匹配辦法
▪位置表示法:依靠位置順序來標識
▪命名表示法:使用‘=>’來標識,即:形參名=>實參名(實參值)
begin -- 位置表示法 p_param_default('Good ', 'morning', 1, sysdate+1); -- 命名表示法 p_param_default(param1 => 'Good',param4=>sysdate+1); -- 混合表示法 p_param_default('Good', param4 => sysdate + 1); End;
注意:一般情況下,定義過程時,建議沒有默認值的in參數放在參數列表的開始位置,其后是out參數,然后是in out參數,最后是有默認值的in參數