Oracleサブルーチンパラメータモード、IN、OUT、NOCOPY


INは主に着信パラメータに用いられます。変数、定数、表現であっても、サブルーチン内部ではその値を変えることができません。
 
DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 IN NUMBER) IS
BEGIN
dbms_output.put_line(n1); -- prints 10
--n1:=20; --illegal assignment.
END;
BEGIN
do_something(n);
do_something(20);
END;
OUTモードは戻り値に用いられます。変数呼び出しに入る必要があります。変数の初期の値はフォームパラメータには伝えられません。<1>に示すように、形パラメータの値はサブルーチンの戻り時(形式パラメータが変化した時ではありません)にcopyを実参します。戻る前に異常が発生した場合、実際のパラメータの値は変更されません。
 
DECLARE
n NUMBER := 10;
PROCEDURE do_something (
n1 OUT NUMBER) IS
BEGIN
dbms_output.put_line('before assign: ' || n1); -- prints none <<1>>
n1:=20;
dbms_output.put_line('before return: ' || n); -- prints 10 <<2>>
END;
BEGIN
do_something(n);
dbms_output.put_line('after return: ' || n); -- prints 20
END;
NOCOPYモードはOUTモードが呼び出し時に引用モードで行われているかどうかを規定するために使用されます。デフォルトでは、OUTモードのパラメータは転送値で呼び出されます。INは主にパラメータに使用されます。n 2:=20が呼び出されますが、戻る時に有効になります。<1>に示すように、NOCOPYは引用です。賦値の時に即効します。<2>に示すように、戻る前に異常が発生すると、実際のパラメータの値も変わります。OUTパラメータはサブルーチンの返却時に、実際のパラメータに値copyを適用しますので、呼び出したnの値は<673>になります。