【问题标题】:Calling a stored procedure in Oracle with IN and OUT parameters在 Oracle 中使用 IN 和 OUT 参数调用存储过程
【发布时间】:2012-04-18 23:12:20
【问题描述】:

我有这个程序:

CREATE OR REPLACE PROCEDURE PROC1(invoicenr IN NUMBER, amnt OUT NUMBER)
AS BEGIN
SELECT AMOUNT INTO amnt FROM INVOICE WHERE INVOICE_NR = invoicenr;
END;

所以当我这样运行它时,它绝对不会返回任何东西:

DECLARE
    amount NUMBER;
BEGIN
    PROC1(1000001, amount);
    dbms_output.put_line(amount);
END;

顺便说一句,我使用 DreamCoder for Oracle。程序本身或我调用它的方式有问题吗? INVOICE 表中有一个 INVOICE_NR 等于 1000001 的条目。

【问题讨论】:

  • 如果你运行“begin dbms_output.put_line('output test') end;”你看到输出了吗?这个过程和调用方式是完全正确的。
  • 我以这种方式运行它,但我没有看到输出。 DreamCoder 是否有可能不显示 put_line() 的输出?
  • 不,我试过BEGIN dbms_output.put_line('hi'); END;,它也没有显示任何内容。

标签: sql oracle11g


【解决方案1】:

如果在整个代码之前将服务器输出设置为 ON 模式,它可以工作,否则 put_line() 将不起作用。试试看!

代码是,

set serveroutput on;
CREATE OR REPLACE PROCEDURE PROC1(invoicenr IN NUMBER, amnt OUT NUMBER)
AS BEGIN
SELECT AMOUNT INTO amnt FROM INVOICE WHERE INVOICE_NR = invoicenr;
END;

然后按原样调用函数:

DECLARE
amount NUMBER;
BEGIN
PROC1(1000001, amount);
dbms_output.put_line(amount);
END;

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。我使用了一个触发器,在那个触发器中我调用了一个程序,该程序将一些值计算为 2 个 OUT 变量。当我尝试在触发器主体中打印结果时,屏幕上没有显示任何内容。但后来我通过在一个函数中创建 2 个局部变量来解决这个问题,用它们计算我需要的东西,最后,将这些变量复制到你的 OUT 过程变量中。我希望它有用且成功!

    【讨论】:

    • 同样适用于 .NET:当我从 .net 调用 Oracle procs 时,除非我选择局部变量,然后将局部变量值传递给 OUT 变量,否则会返回 null。
    【解决方案3】:

    转到菜单工具 -> SQL 输出,运行 PL/SQL 语句, 输出将显示在 SQL 输出面板上。

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 1970-01-01
      • 2020-09-22
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 2019-04-26
      • 2021-11-19
      相关资源
      最近更新 更多