我想在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一个OUT-Position gebunden ......
即。对于execute immediate语句,似乎与in和output valiables混淆。
现在我对这个问题感到困惑。
任何人都可以帮助我吗?
答案 0 :(得分:1)
好的,我自己找到了解决方案:
我只需通过以下方式纠正执行行:
EXECUTE IMMEDIATE dynCall USING c,si,mn,OUT res;
Web文档缺少这样的示例(我没有找到任何内容)。
答案 1 :(得分:0)
好的,它可以做得更简单,没有换行符,几乎没有变量绑定:
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;