欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-17 19:55:52
...

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版)》