PL/SQL子程序存储过程IN,OUT,IN OUT参数模式详解

时间:2021-08-03 05:12:07

PL/SQL存储过程的形式参数模式有三种,分别是IN、OUT、IN OUT,三种模式详解如下,结合后面代码看更容易理解。

PL/SQL子程序存储过程IN,OUT,IN OUT参数模式详解

IN模式的形参只能进行读操作,对其进行赋值(写操作)会出现编译错误,如下图;

PL/SQL子程序存储过程IN,OUT,IN OUT参数模式详解


以下代码p_InParameter、p_OutParameter、p_InOutParameter为形参,v_In、v_Out、v_InOut为相应的实参。以下结合三种情况进行分析

1.实参v_Out调用过程后输出为7而不是2(结果看【调试执行结果:】图),因为在过程对相应的形参进行了写操作p_OutParameter := 7,过程结束返回调用环境后形参的值赋给了实参;

2.若把paramodetest存储过程内的写操作p_OutParameter := 7注释掉,则最后v_Out的值为空,如下图结果。可根据模式详解表格自行分析

PL/SQL子程序存储过程IN,OUT,IN OUT参数模式详解

3.若把paramodetest存储过程内的写操作p_InOutParameter := 8注释掉,则最后v_InOut的值3,如下图结果。因为形参p_InOutParameter 为IN OUT模式,实参v_InOut=3会把值传递给形参,在过程内,形参就像初始化了的变量。期间,形参没有被赋值没有发生改变(写操作注释掉了),最后形参p_InOutParameter =3就会赋给实参。

PL/SQL子程序存储过程IN,OUT,IN OUT参数模式详解

【测试 调用paramodetest存储过程代码:】

declare 
v_In number := 1;
v_Out number :=2;
v_InOut number :=3;
begin
dbms_output.put_line('未调用过程前【实参】的输出:');
dbms_output.put_line('v_In = '|| v_In ||'; v_Out = '||v_Out|| '; v_InOut = '||v_InOut);
--未调用过程前【实参】的输出:
--v_In = 1; v_Out = 2; v_InOut = 3

paramodetest(v_In, v_Out, v_InOut);

dbms_output.put_line('调用过程后【实参】的输出:');
dbms_output.put_line('v_In = '|| v_In ||'; v_Out = '||v_Out|| '; v_InOut = '||v_InOut);
--调用过程后【实参】的输出:
--v_In = 1; v_Out = 7; v_InOut = 8
end;
 【调试执行结果:】

PL/SQL子程序存储过程IN,OUT,IN OUT参数模式详解

【paramodetest存储过程代码:】

CREATE OR REPLACE PROCEDURE paramodetest(p_InParameter    IN NUMBER,
p_OutParameter OUT NUMBER,
p_InOutParameter IN OUT NUMBER) IS
v_LocalVariable NUMBER := 0;
BEGIN
dbms_output.put_line('---未对存储过程【形参】读写操作前【形参】的输出:---');
if (p_InParameter is null) then
dbms_output.put('p_InParameter is null;');
else
dbms_output.put('p_InParameter = ' || p_InParameter || ';');
end if;
if (p_OutParameter is null) then
dbms_output.put('p_OutParameter is null;');
else
dbms_output.put('p_OutParameter = ' || p_OutParameter || ';');
end if;
if (p_InOutParameter is null) then
dbms_output.put_line('p_InOutParameter is null');
else
dbms_output.put_line('p_InOutParameter = ' || p_InOutParameter);
end if;

v_LocalVariable := p_InParameter; --读参数
--p_InParameter := 7; --写参数 会出现编译错误,此处屏蔽掉

v_LocalVariable := p_OutParameter; --读参数
p_OutParameter := 7; --写参数

v_LocalVariable := p_InOutParameter; --读参数
p_InOutParameter := 8; --写参数

dbms_output.put_line('---对存储过程【形参】读写操作后【形参】的输出:---');

if (p_InParameter is null) then
dbms_output.put('p_InParameter is null;');
else
dbms_output.put('p_InParameter = ' || p_InParameter || ';');
end if;
if (p_OutParameter is null) then
dbms_output.put('p_OutParameter is null;');
else
dbms_output.put('p_OutParameter = ' || p_OutParameter || ';');
end if;
if (p_InOutParameter is null) then
dbms_output.put_line('p_InOutParameter is null');
else
dbms_output.put_line('p_InOutParameter = ' || p_InOutParameter);
end if;

END paramodeltest;

有任何问题欢迎讨论交流~

注:文章程序代码来自《oracle 10g 数据库基础教程(第2版)》