由于业务,需要插入图片的base64编码,字段类型选用的是clob
也用了to_clob进行切割,但还是报错了string literal too long
网上有很多教程,讲的是使用PL/SQL语法插入,但试了一圈好像也没啥用
大致如下
DECLARE
clobValue t_msg_template.TEMPLATE_CONTENT%TYPE;
BEGIN
clobValue := '<!DOCTYPE html>XXXXX</html>'; --字段内容
UPDATE t_msg_template T SET T.TEMPLATE_CONTENT = clobValue TEMPLATE_ID='2';
COMMIT;
END;
/
我的语句是(示例):
DECLARE
clobValue AVATAR_BASE64%TYPE;
BEGIN
clobValue := 'base64图片示例'; --字段内容
INSERT INTO user(ID, AVATAR_BASE64) VALUES ('182', clobValue);
COMMIT;
END;
/
但还是报错,报错为:
最后还是问了ChatGPT才知道这么写会没法声明变量clobValue
改了一下,最后的PL/SQL语句如下:
DECLARE
clobValue CLOB;
BEGIN
clobValue := 'base64图片示例'; --字段内容
INSERT INTO user(ID, AVATAR_BASE64) VALUES ('182', clobValue);
COMMIT;
END;
/
成功插入!!!不得不说,【ChatGPT Plus】帮我分析并且给我解决方案,确实是省了我很多找资料的功夫
但在一些数据库客户端下还是会报错,报错原因如下
这个错误通常发生在使用数据库客户端或工具(如 PL/SQL Developer、SQL*Plus 等)执行包含大对象(如 CLOB)的 PL/SQL 块时。这个错误可能是由于参数类型定义不正确或不完整导致的。
ChatGPT 4也给出了合适的改进方案,如下:
DECLARE
clobValue1 CLOB;
clobValue2 CLOB;
BEGIN
-- 创建临时CLOB
DBMS_LOB.CREATETEMPORARY(clobValue1, TRUE);
DBMS_LOB.CREATETEMPORARY(clobValue2, TRUE);
-- 使用DBMS_LOB写入数据
DBMS_LOB.WRITEAPPEND(clobValue1, LENGTH('some large data 1'), 'some large data 1');
DBMS_LOB.WRITEAPPEND(clobValue2, LENGTH('some large data 2'), 'some large data 2');
-- 执行您的其他逻辑或插入操作
INSERT INTO user(ID, AVATAR_BASE64) VALUES ('182', clobValue1||clobValue2);
-- 释放临时CLOB
DBMS_LOB.FREETEMPORARY(clobValue1);
DBMS_LOB.FREETEMPORARY(clobValue2);
END;
/
而在此基础上,我们需要把原本要放入clob字段的字符串进行分段,以及计算字符串长度,这里我也给大家贴了一段分割的代码,大家可以给我点点赞b( ̄▽ ̄)d吗?非常感谢
def split_string_by_length(input_string, length=9000):
"""
将输入字符串按指定长度分割
:param input_string: 需要分割的字符串
:param length: 每个分割部分的最大长度,默认为9000
:return: 分割后的字符串列表
"""
if not input_string:
return []
# 使用列表推导式按照指定长度分割字符串
return [input_string[i:i+length] for i in range(0, len(input_string), length)]
if Avatar_Base64:
Avatar_Base64_List = split_string_by_length(Avatar_Base64)
# 处理clob字段
clob_value = ""
clob_build = ""
clob_init = ""
clob_release = ""
clob_sql_value = ""
for i, item in enumerate(Avatar_Base64_List):
clob_init = f"""{clob_init}clobValue{i+1} CLOB;\n"""
clob_build = f"""{clob_build}DBMS_LOB.CREATETEMPORARY(clobValue{i+1}, TRUE);\n"""
clob_value = f"""{clob_value}DBMS_LOB.WRITEAPPEND(clobValue{i+1}, {len(item)}, '{item}');\n"""
clob_sql_value = f"""{clob_sql_value}clobValue{i+1}||"""
clob_release = f"""{clob_release}DBMS_LOB.FREETEMPORARY(clobValue{i+1});\n"""
if clob_sql_value.endswith("||"):
clob_sql_value = clob_sql_value[:-2]
if not clob_sql_value:
clob_sql_value = """''"""
至此,所有问题迎刃而解,可以正常运行SQL语句