oracleクラス収録-パラメータ

3860 ワード

ストレージ・プロシージャを作成する際に、パラメータを使用することでプログラム・ユニットを柔軟にすることができ、パラメータはプログラム・ユニットにデータを入力および出力するメカニズムであり、ストレージ・プロシージャはゼロから複数のパラメータに戻ることができる.
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パラメータ
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  /

     。
プロシージャには戻り値があるため、呼び出すときに戻り値を受け入れる変数を指定する必要があります.
さっき作成したストレージ・プロシージャsearch_を呼び出します.employee
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パラメータ
IN OUTパラメータは、プロシージャを呼び出す際に、そのタイプのパラメータに値を入力してもよいし、そのパラメータから値を受信してもよい.
栗を挙げて、2つのデータを交換する位置
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プロセスは2つの変数の値を交換するために同時に2つのパラメータを入力する必要があり,交換が完了した後に2つのパラメータを同時に返す必要がある.
匿名ブロック呼び出し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        。