oracle 存储过程里用 execute immedate 动态sql,更新一个表的clob字段报字符长度
A表有两个字段A_CLOBclob,和A_KEY主键,B表有两个字段B_CLOBclob和B_KEY主键。用下边这个报‘ORA-01704:字符串文字太长’错误。请大神指...
A表 有两个字段A_CLOB clob,和A_KEY主键,
B表有两个字段 B_CLOB clob 和B_KEY 主键。
用下边这个报 ‘ORA-01704: 字符串文字太长 ’错误。请大神指点 (我最终要更新多个表,所以最终的要更新的表名也要用个游标,所以才想用这个动态sql的)
CREATE OR REPLACE PROCEDURE GX_CLOB IS
V_SQL clob;
CURSOR CUR IS
SELECT A_KEY,A_CLOB FROM A;
BEGIN
FOR AA IN CUR LOOP
V_SQL := 'UPDATE B '|| ' SET B_CLOB = ''' || AA.A_CLOB ||''' WHERE B_KEY = '''|| AA.A_KEY || '''';
EXECUTE IMMEDIATE V_SQL;
END LOOP;
END; 展开
B表有两个字段 B_CLOB clob 和B_KEY 主键。
用下边这个报 ‘ORA-01704: 字符串文字太长 ’错误。请大神指点 (我最终要更新多个表,所以最终的要更新的表名也要用个游标,所以才想用这个动态sql的)
CREATE OR REPLACE PROCEDURE GX_CLOB IS
V_SQL clob;
CURSOR CUR IS
SELECT A_KEY,A_CLOB FROM A;
BEGIN
FOR AA IN CUR LOOP
V_SQL := 'UPDATE B '|| ' SET B_CLOB = ''' || AA.A_CLOB ||''' WHERE B_KEY = '''|| AA.A_KEY || '''';
EXECUTE IMMEDIATE V_SQL;
END LOOP;
END; 展开
1个回答
2016-09-12 · 知道合伙人软件行家
renfengjun1986
知道合伙人软件行家
向TA提问 私信TA
知道合伙人软件行家
采纳数:925
获赞数:1553
中国地质调查局特聘数据库专家 CSDN博客专家 百度知道数据库行家 炼数成金版主 想了解更多请关注我的博客:
向TA提问 私信TA
关注
展开全部
sql里面varchar2最多4000个字节,sql语句最多32K长度,估计是你的a_clob太长,放到sql里面超过这个限制了,具体是哪个原因还得你自己测试。
可以使用绑定变量的方式来做。
V_SQL := 'UPDATE B '|| ' SET B_CLOB = ''' || AA.A_CLOB ||''' WHERE B_KEY = '''|| AA.A_KEY || '''';
EXECUTE IMMEDIATE V_SQL;
改成:
V_SQL := 'UPDATE B SET B_CLOB =:1 WHERE B_KEY =:2 ';
EXECUTE IMMEDIATE V_SQL using AA.A_CLOB,AA.A_KEY;
可以使用绑定变量的方式来做。
V_SQL := 'UPDATE B '|| ' SET B_CLOB = ''' || AA.A_CLOB ||''' WHERE B_KEY = '''|| AA.A_KEY || '''';
EXECUTE IMMEDIATE V_SQL;
改成:
V_SQL := 'UPDATE B SET B_CLOB =:1 WHERE B_KEY =:2 ';
EXECUTE IMMEDIATE V_SQL using AA.A_CLOB,AA.A_KEY;
追问
谢谢大神,再请教下:
V_SQL := 'UPDATE :1 SET B_CLOB =:2 WHERE B_KEY =:3 ';
EXECUTE IMMEDIATE V_SQL using BB.TABLE_NAME,AA.A_CLOB,AA.A_KEY ;
我要更新多个表, 这个表名,也是另外一个游标BB得到的。 用:1 ,这种写法,怎么也报错呢?报ORA-00903: 表名无效。
追答
表名?无法使用绑定变量,只能拼进去。不然sql语句的语法语义解析都过不去,到不了替换绑定变量的阶段。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询