oracle里面的单引号问题

cnham 2010-01-27 03:24:18
在存储过程里,有如下代码
........................
l_productstr := '(' || chr(39) || '10000024' || chr(39) || ')';

insert into t_test1
select * from t_productinfo where pi.productcode in l_productstr;
........................

运行的时候,没有数据插入到表 t_test1中去;
但是如果改成:
..............................
select * from t_productinfo where pi.productcode in ('10000024');
..............................
就可以有数据插入到t_test1中去;

到底是咋回事情呢?
在线等待。

btw:
至于为啥要用l_productstr,因为我的存储过程里面用的是动态的,而且是多个组合的productcode。

...全文
279 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cd_yuxueming 2010-01-28
  • 打赏
  • 举报
回复
exec
crazylaa 2010-01-27
  • 打赏
  • 举报
回复
用 execute immediate来执行insert。执行前先dbms_output.put_line把sql打出来看看duibudui?
wh62592855 2010-01-27
  • 打赏
  • 举报
回复
当前登录的用户是表t_productinfo的拥有者吗?

在存储过程中如果是通过角色赋予用户的权利有时是不起作用的
cnham 2010-01-27
  • 打赏
  • 举报
回复
在多发点代码吧,看的更清楚些。
open c_favcycleproduct;
loop
fetch c_favcycleproduct
into l_productcode;
exit when c_favcycleproduct%notfound;

l_productstr := l_productstr || ''''||l_productcode||'''' || ',';
--l_productstr := l_productstr || l_productcode || ',';
insert into t_subtype_pdt_fee
(id, subtype, productcode, price)
select rownum as num,
us.usertypeid,
l_productcode,
getSubTypeProductFee(us.usertypeid, l_productcode) bprice
from t_usertypes us;
end loop;
close c_favcycleproduct;

l_tmpb := length(l_productstr);
l_productstr := substr(l_productstr, 0, l_tmpb - 1) || ')';
cnham 2010-01-27
  • 打赏
  • 举报
回复
to tangren:
循环没问题,这个可以放心。我测试过的。
奇怪的地方在于循环后的结果,拿出来单独执行查询,是可以的。
但在存储过程里面执行就找不到结果。
所以我怀疑是单引号的问题。
tangren 2010-01-27
  • 打赏
  • 举报
回复
可能是你循环拼接得不对,
你拼完以后,可以打出来看一下你的SQL对不对
tangren 2010-01-27
  • 打赏
  • 举报
回复
--应该可以的吧,看这个

SQL> set serveroutput on;

SQL>
DECLARE
in_str VARCHAR2(4000);
v_ename VARCHAR2(30);
BEGIN
in_str := '(' || chr(39) || 'WARD' || chr(39) || ')';
EXECUTE IMMEDIATE 'select t.ename from emp t where t.ename in ' || in_str
INTO v_ename;
dbms_output.put_line(v_ename);
END;
/

WARD

PL/SQL procedure successfully completed

SQL>
cnham 2010-01-27
  • 打赏
  • 举报
回复
我试试看
cnham 2010-01-27
  • 打赏
  • 举报
回复
谢谢楼上的答复。不过你的答案似乎不太准确。
再加上一些代码吧,这样看起来更准确些。
.................
open c_favcycleproduct;
loop
fetch c_favcycleproduct
into l_productcode;
exit when c_favcycleproduct%notfound;

l_productstr := l_productstr || chr(39) || l_productcode || chr(39) || ',';
--l_productstr := l_productstr || l_productcode || ',';
end loop;
close c_favcycleproduct;
...................
insert into t_test1
select * from t_productinfo where pi.productcode in l_productstr;
...................

yuzhenhuan01 2010-01-27
  • 打赏
  • 举报
回复
'''||字符串变量||'''
iqlife 2010-01-27
  • 打赏
  • 举报
回复
select '''a''' from emp
输出'a'

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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