完美解决Oracle Clob报错string literal too long问题(详细全过程)

由于业务,需要插入图片的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语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ztop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值