【问题标题】:Oracle stored procedures ... any problems putting an OUT parameter before an IN parameter?Oracle 存储过程...在 IN 参数之前放置 OUT 参数有什么问题吗?
【发布时间】:2011-01-05 22:10:36
【问题描述】:

在 oracle 中调用存储过程时,参数类型的顺序是否重要?

例如(请原谅语法错误)

my_proc (
param_a IN NUMBER
, param_b IN STRING
, param_c OUT NUMBER
, param_d OUT STRING
) begin
param_c = param_a
param_d = param_b
end

当我们执行上述操作时,我们会在 OUT 参数中将传入的值重新传回(再次请原谅特定的语法)。

但是,当我们将 param_c 移到 param_b 上时,我们得到 0.0 和 NULL 而不是传入的值。

my_proc (
param_a IN NUMBER
, param_c OUT NUMBER
, param_b IN STRING
, param_d OUT STRING
) begin
param_c = param_a
param_d = param_b
end

我们正在 PL/SQL 中对此进行测试。

有什么我们忽略的吗?

谢谢 巴尤鲍勃

【问题讨论】:

    标签: oracle plsql oracle11g


    【解决方案1】:

    您可以按照您想要的任何顺序定义您的 IN/OUT 参数。你怎么称呼这个程序?如果您传入一个空字符串,您将获得一个 NULL 输出值。例如:

    declare
       param_c   NUMBER;
       param_d   VARCHAR2(100);
    begin
    
      my_proc (
        0,
        param_c,
        '',
        param_d
      );
    
      dbms_output.put_line(param_c);
    
      dbms_output.put_line(nvl(param_d, 'null'));
    
    end;
    

    这应该输出:

    0
    null
    

    【讨论】:

      【解决方案2】:

      感谢所有考虑过这一点的人,但事实证明这有点简单。看来您通过 ojdbc6 调用存储过程的方式有很大的不同。

      我应该承认这最初是一个我们试图用 PL/SQL 确认的 java / oracle 问题。

      如果我们将存储过程称为“call my_proc(...)”,那么 IN 和 OUT 参数的顺序似乎很重要;而 'begin my_proc(...) end' 工作得很好。

      注意:这适用于在 Java 6 中使用 ojdbc6 构建可调用语句。

      【讨论】:

      • 您使用的是命名参数还是位置参数?命名有时不会像您预期的那样被处理,而是被视为位置,这可以解释您所看到的。
      • 我们正在从位置切换到命名,试图将自己与提供我们必须连接到的数据库的客户的突发奇想脱钩。
      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 2013-11-02
      • 2012-04-18
      • 2012-03-11
      • 2018-12-23
      • 2011-02-02
      • 1970-01-01
      • 2019-04-26
      相关资源
      最近更新 更多