把oracle库里带有clob和blob字段的表ETL_WORKFLOW_TEMPLATE,数据导成脚本,通过应用jdbc调用该脚本,初始化到新部署的应用库。ETL_WORKFLOW_TEMPLATE的表结构为
导入的脚本如下,clob字段可直接插入字符串,blob字段需要通过HexToRaw函数插入十六进制码。
INSERT INTO ETL_WORKFLOW_TEMPLATE(ID, NAME_,ORD,MSG, CREATE_TIME,LAST_UPDATE_TIME, CREATE_USER,TENANT_ID,DEFINATION_XML, IMG)
VALUES('107954258','class-read-write','1','读写文件','1570532515498','0', '1', 'tenant1', 'clob字段超长......直到超过4000', ** HexToRaw ** ('89504E470D0......超长的十六进制字符码'));
然后插入sql时候就报错【ORA-01704: string literal too long】。
该sql在oracle客户端报错【ORA-01704: string literal too long】
CREATE OR REPLACE PROCEDURE P_Insert_WORKFLOW_TEMPLATE
IS
v_clob clob:='clob字段超长......直到超过4000';
v_blob blob :=to_blob('89504E470D0......超长的十六进制字符码......');
begin
insert into ETL_WORKFLOW_TEMPLATE(ID, NAME_, ORD, MSG, CREATE_TIME, LAST_UPDATE_TIME, CREATE_USER, TENANT_ID, DEFINATION_XML, IMG)
values('103418475', 'java节点解析RestAPI节点返回参数', '1', 'java节点解析RestAPI节点返回参数,并作为工作流变量赋值使用。', '1566296929653', '1', '1', 'public',v_clob,v_blob);
commit;
end;
;
call oraclekf.P_Insert_WORKFLOW_TEMPLATE ();
有的过程可以执行成功,有的过程调用失败【PLS-00172: string literal too long】,执行失败的sql发现是由于clob字段(DEFINATION_XML) 或者blob字段(IMG)太长导致的。
百度查询,该报错为PLS-00172: string literal too long,是由于sql语句超长导致的,sql语句超过32767 字节。
The string literal was longer than 32767 bytes.
Use the '||' to join.
sql整体字符串文字长度超过32767字节,可用’||’ 拼接。把过程中的v_clob 和v_blob 中的字符串中间加上拼接符号’||’ ,问题解决。
v_clob clob:='clob字段超长...'||'...直到超过4000';
v_blob blob :=to_blob('89504E470D0...'||'...超长的十六进制字符码......');
谢谢观看。