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