最近在做一个ESB项目,有一个trigger里面执行动态SQL的时候报错:
ORA-01704: 字符串文字太长
经检查发现SQL里面有个字段是clob类型,内容长度4009,在oracle里面,
一对引号内的字符长度如果超过4000,就会报ORA-01704: 字符串文字太长的错误;
在网上查了一下资料,有大神提出了解决的方法:动态SQL+变量绑定:
什么是动态SQL、什么是变量绑定,度娘上有很多资料,这里就不解释了
下面例子测试通过了:
EXECUTE IMMEDIATE 'insert into '||V_ROW.t_id||' VALUES(:1,:2,:3,:4,:5)'
USING V_1, V_2, V_3, V_4, V_CLOB;
上面的:1,:2,:3,:4,:5就是绑定变量,using后面的几个变量就是和上面的几个绑定变量一一对应;
最后一个变量V_CLOB是一个内容长度超过4000的clob类型变量;
如果写成这样:会报ORA-01704: 字符串文字太长的错误;
EXECUTE IMMEDIATE 'insert into '||V_ROW.t_id
||' VALUES('''||REPLACE(V_1,'''','''''')
||''','''||REPLACE(V_2,'''','''''')
||''','''||REPLACE(V_3,'''','''''')
||''','''||REPLACE(V_4,'''','''''')
||''','''||V_CLOB
||''')';
上面对分隔符做了处理,不做多解释,这里V_CLOB变量,内容超过4000长,所以会报错字符串太长