在創建存儲過程時,通過使用參數可以使程序單元變得很靈活,參數是一種向程序單元輸入和輸出數據的機制,存儲過程可以接受和返回零到多個參數。
1.IN參數
該類型的參數值由調用者傳入,並且只能被存儲過程讀取。
SQL> create or replace procedure add_employee(
2 id_param in number,
3 name_param in varchar2,
4 job_param in varchar2,
5 hire_param in date,
6 salary_param in number
7 )is
8 begin
9 insert into scott.emp(empno,ename,job,hiredate,sal)
10 values(id_param,name_param,job_param,hire_param,salary_param);
11 end add_employee;
12 /
過程已創建。
通過名稱傳遞發傳遞參數
SQL> alter session set nls_date_format='yyyy-mm-dd';
會話已更改。
SQL> begin
2 add_employee(id_param=>8000,name_param=>'ATG',
3 job_param=>'CLERK',hire_param=>'1997-12-20',
4 salary_param=>1500);
5 end;
6 /
PL/SQL 過程已成功完成。
通過位置傳遞法傳遞參數
SQL> exec add_employee(8021,'劉麗','SALESMAN','1995-10-17',2000);
PL/SQL 過程已成功完成。
還可以採用混合表示法傳遞參數。
2.OUT參數
SQL> create or replace procedure search_employee(
2 empno_param in number,
3 name_param out scott.emp.ename%type,
4 salary_param out scott.emp.sal%type
5 )is
6 begin
7 select ename,sal
8 into name_param,salary_param
9 from scott.emp
10 where empno=empno_param;
11 exception
12 when no_data_found then
13 name_param:='NULL';
14 salary_param:=-1;
15 dbms_output.put_line('未找到指定編號的員工信息!');
16 end search_employee;
17 /
過程已創建。
因爲過程中有返回值,所以調用它時必須提供能夠接受返回值的變量。SQL> variable name varchar2(10);
SQL> variable sal number;
SQL> exec search_employee(7499,:name,:sal);
PL/SQL 過程已成功完成。
查看執行結果SQL> print name
NAME
--------------------------------
ALLEN
SQL> print sal
SAL
----------
1600
也可以通過SELECT語句檢索綁定的變量值
SQL> select :name,:sal
2 from dual;
:NAME :SAL
-------------------------------- ----------
ALLEN 1600
在匿名程序塊重調用存儲過程search_employee
SQL> set serverout on
SQL> declare
2 name scott.emp.ename%type;
3 sal scott.emp.sal%type;
4 begin
5 search_employee(7499,name,sal);
6 dbms_output.put_line('name:'||name);
7 dbms_output.put_line('sal:'||sal);
8 end;
9 /
name:ALLEN
sal:1600
PL/SQL 過程已成功完成。
在調用具有OUT參數的存儲過程時,必須爲OUT參數提供變量,即使OUT參數在過程中沒有設置返回值,調用時也要爲其提供接收變量,否則報錯。3.IN OUT參數
SQL> create or replace procedure swap(
2 num1_param in out number,
3 num2_param in out number) is
4 var_temp number;
5 begin
6 var_temp:=num1_param;
7 num1_param:=num2_param;
8 num2_param:=var_temp;
9 end swap;
10 /
過程已創建。
在栗子中SWAP過程爲了交換兩個變量的值,需要同時向它傳入兩個參數,交換完之後還需要同時返回兩個參數。
SQL> set serverout on
SQL> declare
2 var_max number:=23;
3 var_min number:=45;
4 begin
5 if var_max<var_min then
6 swap(var_max,var_min);
7 end if;
8 dbms_output.put_line(var_max||'>'||var_min);
9 end;
10 /
45>23
PL/SQL 過程已成功完成。