Oracle数据库CLOB字段提示ORA-01704:字符串文字太长的处理方法
1.方法一:插入的SQL比较少,那么可以人工处理。
针对可以使用PL/SQL工具连接的数据库:
1、打开PL/SQL工具,输入SQL语句,如下:
select * from 表名 for UPDATE;
2、把更新的小锁打开,找到CLOB字段,点击 ‘…’, 将内容复制进来,点击’确定’按钮,点击绿色对勾提交即可。
2.方法二:如果插入的SQL比较多,那么需要先把所有的SQL语句插入到表中,然后对SQL语句进行处理。
首先需要找规律,找到规律了,然后用PL/SQL块进行插入或更新即可。
对Oracle数据库插入或者更新CLOB字段的时候,直接拼接了一个INSERT INTO和UPDATE语句,类似下面这种:
INSERT INTO 表名(字段1, 字段2, CLOB字段) VALUES (‘XX’, ‘XXX’, ‘内容非常多’);
UPDATE 表名 T SET T.CLOB字段名 = ‘内容非常多’;
oracle默认把字符串转换成varchar2类型,而这个字符串的长度,又比4000大,所以会报ORA-01704错误。
说得通俗一点,就是两个单引号之间的字符不能超过4000。
解决办法:使用PL/SQL语法,采取绑定变量的方式解决,而不是直接拼接SQL
DECLARE
clobValue 表名.字段名%TYPE;
BEGIN
clobValue := 'XXX'; ----字段内容,但是单引号中的内容不能超过4000字符
UPDATE 表名 T SET T.字段名 = clobValue WHERE 条件;
COMMIT;
END;
/
--采取绑定变量 2
DECLARE
V_LANG CLOB := '待插入的海量字符串';
V_UPDATE CLOB := '更新的海量字符串';
BEGIN
INSERT INTO temp t VALUES ('Grand.Jon', 22, V_LANG); --增加
UPDATE temp t SET t.temp_clob = V_UPDATE WHERE rownum = 1; --修改
SELECT t.NAME, dbms_lob.substr(t.temp_clob) FROM TEMP t; --查询 将CLOB转成字符类型
DELETE temp t WHERE rownum = 1; --按列删除
COMMIT;
END;
/
-- insert多个绑定变量
declare
v_clob1 clob:='一个长文本1';
v_clob2 clob:='一个长文本2';
begin
insert into 表名 values('1',v_clob1,v_clob2);
end;
/
3.方法三 使用sql命令插入clob数据(大于4000,适用于18c)
–使用sql命令插入clob数据(大于4000,适用于18c)
INSERT INTO XXXX.XXXX
(UPDATE_TIME, FILE_NAME, FILE_TYPE, CONTENT)
VALUES
(TO_TIMESTAMP('22-10月-20 02.30.45.000000000 下午',
'DD-MON-RR HH.MI.SSXFF AM'),
'CCCCC_2020-10-16.RB',
'test5',
TO_CLOB(q'[]') || TO_CLOB(q'[]') || TO_CLOB(q'[]') || TO_CLOB(q'[]'));
--在q'[]’中填写小于4000个字符的值,如果有9000个,就分成三段,如:
INSERT INTO XXXX.XXXX
(UPDATE_TIME, FILE_NAME, FILE_TYPE, CONTENT)
VALUES
(TO_TIMESTAMP('22-10月-20 02.30.45.000000000 下午','DD-MON-RR HH.MI.SSXFF AM'), 'CCCCC_2020-10-16.RB', 'test5',
TO_CLOB(q'[AAAAAAAAAAAAAAAAAAAAA]') || TO_CLOB(q'[BBBBBBBBBBBBBBBBB]') || TO_CLOB(q'[CCCCCCCCCCCCCCCCCCC]'));
–其他参考方法 https://blog.51cto.com/u_11310506/2431176