oracle存储过程中动态SQL的绑定变量问题,请高手急救!!!

ray428 2004-12-30 11:39:02
ModuleCalculate:='update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||' where company_id = :1 and salary_list_cd = :2';
execute immediate ModuleCalculate using company,salaryList;

其中company和salaryList是存储过程传入的变量。

在存储过程中单步调试,进行到上面语句的第一行就报错了:
ORA-06502:PL/SQL:数字或值错误

但是执行
ModuleCalculate:='update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||' where company_id = :1';
execute immediate ModuleCalculate using company;

ModuleCalculate:='update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||' where salary_list_cd = :2';
execute immediate ModuleCalculate using salaryList;
都正确。
...全文
768 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ORARichard 2004-12-30
  • 打赏
  • 举报
回复
前面可能有错,没测试
--try

Create Or Replace Procedure pppp(company Varchar2, salaryList Varchar2)As
ModuleCalculate Varchar2(1000);
Begin
ModuleCalculate:='update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||' where company_id = '''||company||''' and salary_list_cd ='''||salaryList||'''';
execute immediate ModuleCalculate;

End pppp;

ORARichard 2004-12-30
  • 打赏
  • 举报
回复
那在liuyi8903的基础上改一下

Create Or Replace Procedure pppp(company Varchar2, salaryList Varchar2)As
ModuleCalculate Varchar2(1000);
Begin
ModuleCalculate:='update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||' where company_id = '''||company||''' and salary_list_cd ='''||salaryList||''';
execute immediate ModuleCalculate;

End pppp;
constantine 2004-12-30
  • 打赏
  • 举报
回复
up
ray428 2004-12-30
  • 打赏
  • 举报
回复
ORARichard(没钱的日子......) 的方法:
--try:

execute immediate ModuleCalculate using to_char(company),salaryList;

我试了下也不行,报的错和原来一样。
ray428 2004-12-30
  • 打赏
  • 举报
回复
使用liuyi8903(甜脆夹心) 这种方法是不行的,必须要用绑定变量,否则打出的SQL语句会缺少''。
但还是非常感谢liuyi8903(甜脆夹心) 。请大家帮忙多想想办法!
GerryYang 2004-12-30
  • 打赏
  • 举报
回复
认同 liuyi8903(甜脆夹心) 的.
liuyi8903 2004-12-30
  • 打赏
  • 举报
回复
Create Or Replace Procedure pppp(company Varchar2, salaryList Varchar2)As
ModuleCalculate Varchar2(1000);
Begin
ModuleCalculate:='update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||' where company_id = '||company||' and salary_list_cd ='||salaryList;
execute immediate ModuleCalculate;

End pppp;
ORARichard 2004-12-30
  • 打赏
  • 举报
回复
--try:

execute immediate ModuleCalculate using to_char(company),salaryList;
liuyi8903 2004-12-30
  • 打赏
  • 举报
回复
把冒号去掉
ray428 2004-12-30
  • 打赏
  • 举报
回复
为什么where后的内容改变了点就出错了呢?
ray428 2004-12-30
  • 打赏
  • 举报
回复
谢谢各位朋友!
ray428 2004-12-30
  • 打赏
  • 举报
回复
问题解决了,但不知道是为什么,我这么改一下就OK了:
execute immediate
'update T_SALARY_SQL set '||replace(ModuleCalculate,'sal','salary')||
' where company_id = :1 and salary_list_cd = :2'
using company,salaryList;
ray428 2004-12-30
  • 打赏
  • 举报
回复
寒。。。
试了下,也不行呀。。。
我都快崩溃了。。。

17,078

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧