在开发中遇到了一个问题,就是我需要插入 或更新一条数据,如:
update blog set content='11111111111111111...' where id = 1
这时候这个content数据长度是很大的,可以是几千上万个字符, 这时候执行这个sql语句就会出问题,
oracle sql ORA-01704: string literal too long
oracle 数据oracle 的sql 解析器无法直接处理怎么长的数据(mysql可以),这时候要怎么做才能更新或插入这个数据呢,有两个方法 存储过程 和 字符拼接
存储过程
DECLARE
clobValue hushendayrecordlist.hushendayrecordlist%TYPE;
BEGIN
content := '111122222233....',
UPDATE blog b SET b.content = content WHERE id='1';
COMMIT;
END;
使用存储过程将要更新的字符数据赋值给变量, 然后执行sql 的时候sql 解析器直接从变量中获取数据进行更新,在解析器校验sql的时候sql 就没有那么长了,这样就避免了sql 过长的问题,但是,在项目中是无法使用这个存储过程的, 所以这个方法只能舍弃
concat or ||
concat 或 || 可以将数据拼接到原数据后面, 可以这样来使用
update blog set content = concat('', '1111111111111') where id = 1
or
update blog set content = '' || '1111111111111' where id = 1
不过这种情况还是无法解决 数据多长的问题,因为拼接数据的时候, 新数据的长度不能超过1000个字符,不然也会报错, 这时候可以使用 to_clob()函数,to_clob('111111...')可以存储4000个字符的数据,然后用这个 to_clob 进行拼接, 如:
update blog set content = '' || to_clob('1111111...')
如果字符长度超过 4000个字符的时候呢?这时候可以将要更新的新数据按长度进行切割,然后使用多个拼接进行更新, 如:
update blog set content = content || to_clob('111111111...') || to_clob('22222222...') || to_clob('333333...') ... where id = 1
多个to_clob()就可以将可以用一条update 更新 几千上万字符长度的数据, 这个时候虽然sql还是很长,但是有 to_clob()进行包裹,这时候sql 解析器应该是略过这个函数,不把这个to_clob()当做正常的sql字段进行计算
————————————————
版权声明:本文为优快云博主「tnan2522」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_42031243/article/details/112401916