oracle update or insert 字段数据量过长

在开发中遇到了一个问题,就是我需要插入 或更新一条数据,如:
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字段进行计算,

你可能感兴趣的:(sql)