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

时间:2016-03-06 15:38:52

标签: oracle plsql oracle11g

我们被指派在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的帮助下,我得到了它的工作!谢谢:))

2 个答案:

答案 0 :(得分:2)

要看的一些要点:

  • 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;
    /

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

答案 1 :(得分:0)

  

试试这个。希望下面的片段可以帮助你。我在这里只建议一件事   如果计算量很大,则使用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;
/