【问题标题】:Oracle PL/SQL dynamic code executionOracle PL/SQL 动态代码执行
【发布时间】:2013-08-16 16:45:22
【问题描述】:

我想在 oracle pl/sql 语句中执行动态代码。

有效的是:

execute immediate 'begin :r := 3*7*(:aa); end;'  using in out myresvar,100;

现在我想更概括地做:

DECLARE

  -- arbitrary formula to evaluate
  formula VARCHAR2(100) := 'c+si/2.+mn/6.';

  -- string variable to keep pl/sql-code
  dynCall VARCHAR2(2046);

  -- variables to put into formula evaluation
  c   NUMBER := 0.02;
  si  NUMBER := 0.35;
  mn  NUMBER := 1.5;
  res NUMBER;
BEGIN

  dynCall := dynCall || 'DECLARE'       || chr(10);
  dynCall := dynCall || '  c   NUMBER;' || chr(10);
  dynCall := dynCall || '  si  NUMBER;' || chr(10);
  dynCall := dynCall || '  mn  NUMBER;' || chr(10);
  dynCall := dynCall || '  res NUMBER;' || chr(10);
  dynCall := dynCall || 'BEGIN'         || chr(10);

  dynCall := dynCall || '  c   := (:aa);' || chr(10);
  dynCall := dynCall || '  si  := (:bb);' || chr(10);
  dynCall := dynCall || '  mn  := (:cc);' || chr(10);

  dynCall := dynCall || '  :r := ' || formula || ';' || chr(10);

  dynCall := dynCall || 'END;'                    || chr(10);

  EXECUTE IMMEDIATE dynCall USING IN OUT c,si,mn,res;

END;

不幸的是,这会导致错误,例如(德语):

...事务错误:ORA-06536: IN-Bind-Variable an OUT-Position gebunden ...

即执行立即语句的输入和输出变量似乎存在混淆。

现在我很困惑是什么问题。

谁能帮帮我?

【问题讨论】:

    标签: oracle plsql execute using


    【解决方案1】:

    好的,我自己找到了解决方案:

    我只需要通过以下方式更正执行行:

    EXECUTE IMMEDIATE dynCall USING c,si,mn,OUT res;
    

    网络文档缺少此类示例(我没有找到任何内容)。

    【讨论】:

    【解决方案2】:

    好吧,它可以做得更简单,没有换行符,几乎没有变量绑定:

      dynCall := 'DECLARE'        || 
                 '  c   NUMBER:=' || c  || ';' || 
                 '  si  NUMBER:=' || si || ';' || 
                 '  mn  NUMBER:=' || mn || ';' || 
                 '  p   NUMBER:=' || p  || ';' || 
                 '  s   NUMBER:=' || s  || ';' || 
                 '  n   NUMBER:=' || n  || ';' || 
                 '  al  NUMBER:=' || al || ';' || 
                 '  cu  NUMBER:=' || cu || ';' || 
                 '  ni  NUMBER:=' || ni || ';' ||
                 '  mo  NUMBER:=' || mo || ';' || 
                 '  cr  NUMBER:=' || cr || ';' || 
                 '  nb  NUMBER:=' || nb || ';' || 
                 '  v   NUMBER:=' || v  || ';' || 
                 '  ti  NUMBER:=' || ti || ';' || 
                 '  b   NUMBER:=' || b  || ';' || 
                 '  ca  NUMBER:=' || ca || ';' || 
                 'BEGIN'          ||
                 '  :res := ' || formula || ';' ||
                 'END;';
    
      EXECUTE IMMEDIATE dynCall USING OUT res;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 2021-02-10
      • 1970-01-01
      相关资源
      最近更新 更多