日期:2014-05-17  浏览次数:20784 次

求助:关于动态组合oracle存储过程参数
假设存储过程名字SP_TEST,一个参数v_SQL,是sql语句
存储过程内容:
v_id number;
v_id := 11111; --这个可能事动态从表取得的值
execute immediate v_SQL;

在Java代码中组合参数:
sql = "insert into b (id,code) values(1,'||v_id||')";

执行存储过程,这个时候存储过程把v_id看做一个字符串而不是存储过程变量

这个问题该怎么解决?

------解决方案--------------------
方法:
1。存储过程参数只传变量值,存储过程拼sql字符串。
2。java拼完整的sqll字符串,之后把完整字符串作为变量传给存储过程。

很多东西可以变通的。能完成就ok了。


引用楼主 jhlcss 的帖子:
假设存储过程名字SP_TEST,一个参数v_SQL,是sql语句
存储过程内容:
v_id number;
v_id := 11111; --这个可能事动态从表取得的值
execute immediate v_SQL;

在Java代码中组合参数:
sql = "insert into b (id,code) values(1,' ¦ ¦v_id ¦ ¦')";

执行存储过程,这个时候存储过程把v_id看做一个字符串而不是存储过程变量

这个问题该怎么解决?

------解决方案--------------------
那把你要传递的sql语句分成两部分,一部分是变量前的东西,一部分是变量后的东西。
在prodedure中跟其中的变量重新组合,不就解决了吗.

探讨
ls的我明白你的意思,如果能哪么做的话,我肯定就那么做了,但是现在不行。。。。

------解决方案--------------------
设计存在缺陷!

虽说有缺陷,但是还有方法:
在procedure中通过变量替换:把传过来的sql字符串进行对于变量的替换,类似replace(str,替代变量字符串,变量值)。
转换完成后,再execute immediate sql;

探讨
现在是那个传入的SQL是不确定的,动态的,分离不出来