使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle

Posted

技术标签:

【中文标题】使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle【英文标题】:Using two procedures to make simple calculations with OUT and IN parameters, PL/SQL Oracle 【发布时间】:2016-03-06 15:38:51 【问题描述】:

我们被指派用 Oracle 的 11g PL/SQL 语言创建两个用于进行简单计算的过程。 赋值如下:

创建两个过程,其中第一个 (a) 将接收两个带有 IN 参数的值,然后将值发送到过程 b,该过程将计算并显示结果。

我浏览了网络并阅读了有关此的书籍,但我无法让它发挥作用。我经常遇到错误代码,我无法弄清楚我做错了什么。我什至不确定这是否可行,但很难找到答案。

这是我的代码:

SET serveroutput ON

CREATE OR REPLACE PROCEDURE proc_a
(number1 IN NUMBER, number2 IN NUMBER)
AS
BEGIN
  proc_b(number1, number2);
END;
/

CREATE OR REPLACE PROCEDURE proc_b
(number1_proc_a IN OUT NUMBER, number2_proc_a IN OUT NUMBER, result_proc_a OUT NUMBER)
AS
result_proc_a number;
BEGIN 
  result_proc_a := tal1_proc_a + tal2_proc_a;
  dbms_output.put_line('Result: ' || result_proc_a);
END;
/

CALL proc_a(4, 6);

如果有人知道为什么它不起作用,我将不胜感激!我遇到的错误消息是:

PL/SQL: Statement ignored. Object proc_a is invalid.

还有:

Package or function %s is in an invalid state

编辑: 在用户 Sagi 的帮助下,我得到了它的工作!谢谢:)

【问题讨论】:

将输入变量声明为 IN OUT 可以吗?另外,看起来您在开始时将 result_proc_a 声明为 out,那么您为什么要再次定义它呢? 哦,天哪...你是对的。解决了我的问题,哈哈。我一定是被所有的代码弄瞎了!谢谢,它现在按预期工作! :) 【参考方案1】:

需要注意的几点:

proc_b 中有一个重复的变量名 result_proc_a:它被声明为第三个参数和局部变量。 您应该删除局部变量声明。

最好以相反的顺序声明过程。 proc_a依赖于proc_b,所以先创建proc_b。这样 proc_a 在创建后就不会处于无效状态。

虽然参数可以是IN OUT,但是proc_b的前两个参数不需要是OUT。通过删除OUT,您可以使用文字数字调用proc_b

根据您使用的环境,执行普通的call 可能不起作用。在这种情况下,请使用 begin end 块,它始终有效:

    BEGIN
        proc_a(4, 6);
    END;
    /

我看到你的问题已经解决了。我只是留下这个答案以供参考。

【讨论】:

【参考方案2】:

试试这个。希望下面的 sn-p 对您有所帮助。我在这里只建议一件事 如果计算量很大,请使用 pls_integer 代替 NUMBER 参与程序。

SET serveroutput ON

CREATE OR REPLACE PROCEDURE proc_a
(number1 IN OUT PLS_INTEGER, 
number2 IN OUT PLS_INTEGER
)
AS
resl_proc_b PLS_INTEGER;
BEGIN
  proc_b(number1, number2,resl_proc_b);
END;
/

CREATE OR REPLACE PROCEDURE proc_b(
    number1_proc_a IN OUT PLS_INTEGER,
    number2_proc_a IN OUT PLS_INTEGER,
    result_proc_a OUT PLS_INTEGER)
AS
  tal1_proc_a PLS_INTEGER:=0;
  tal2_proc_a PLS_INTEGER:=0;
BEGIN
  result_proc_a := tal1_proc_a + tal2_proc_a;
  dbms_output.put_line('Result: ' || result_proc_a);
END;
/

【讨论】:

以上是关于使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle的主要内容,如果未能解决你的问题,请参考以下文章

oracle中in和out用法

Sybase IN 和 OUT 参数

使用自定义 ItemReader 调用带有 IN 和 OUT 参数的存储过程

使用 IN 和 OUT 参数更改密码过程 PLSQL

Java 和 PostgreSQL 存储过程 - 返回注册为 out 参数,导致 in 参数出现问题

SQL 存储过程中参数怎么使用