Oracle中往表插入或更新大字符串数据报ORA-01704:字符串文字太长的解决方案

对于这个问题,网上也有很多的文章有介绍,但总是差了那么一点点,如:Oracle 解决【ORA-01704:字符串文字太长】-CSDN博客

结合网上的说法:插入oracle的字符串最终会转成varchar2格式

我的解决方案:

1   插入字符串对应的表字段类型要为clob类型,我试过long类型的不行

2   采用pl/sql语法绑定变量解决(结合3,这说法感觉不是很准确),网上有说使用存储过程进行解决(我个人认为本质也是使用绑定变量的方式),但个人发现字符串长度大于4000后还是不行

如:

DECLARE    v_patientSignName  clob;

BEGIN  
             v_patientSignName:='大字符串1abc大字符串2bbb大字符串3' ;

             insert into POOR.COVID19MESSAGE(isHot, patientSignName)  values(1,  v_patientSignName);

END;

3   当插入或者更新得字符串长度在4000-32767,就需要把字符串进行拆分,使用||进行字符串拼接(目的是使用pl/sql语法),如上面的   v_patientSignName:='大字符串1abc大字符串2bbb大字符串3' 改为v_patientSignName:='大字符串1abc'||'大字符串2bbb'||'大字符串3' 

从Oracle官网PL/SQL Data Types中可以看到

(在sql或pl/sql中,即使表字段定义为clob类型,也会转成varchar2类型)varchar2类型在pl/sql的大小是32767,在sql的大小是4000

我下面用C#写了一个demo类进行拼接,字符串拆分长度为4000

 public class ConvertClass
    {
        /// <summary>
        /// 把字符串使用||进行拼接,如  signName="abcdefg...adbdefg...adbdefg..."   转换结果为"'abcdefg..'||'adbdefg...'||'adbdefg...'"
        /// </summary>
        /// <param name="signName">要拆分并使用||进行拼接得字符串</param>
        /// <returns>拼接完毕的字符串</returns>
        public static string ConvertString(string signName)
        {
            int Strlength = signName.Length;
            int Section = Strlength / 4000;
            if (Section == 0)
            {
                return "'"+signName+"'";
            }
            string targetString = "";
            int StartIndex = 0;
            for (int i = 0; i < Section; i++)
            {
                if (i < (Section - 1)&&i>0)
                {
                    string subString = signName.Substring(StartIndex, 4000);
                    targetString += subString + "'||'";
                    StartIndex += 4000;
                }
                else if (i == 0)
                {
                    string subString = signName.Substring(StartIndex, 4000);
                    targetString += "'"+subString + "'||'";
                    StartIndex += 4000;
                }
                else
                {
                    string subString = signName.Substring(StartIndex);
                    targetString += subString + "'";
                }
            }
            return targetString;
        }
    }

4  当插入或者更新的字符串长度大于32767,就需要在代码中使用参数的形式,同时,要插入大字符串的表字段类型为clob,下面的是C#代码采用参数的形式(相信其它语言也是类似的做法)

//p1作为参数
string sql="insert into 表名(id,strValue) values(1,:p1)";
string data="你的大字符串";
OracleConnection conn = new OracleConnection('连接字符串');
OracleCommand cmd = new OracleCommand(sql, conn);
OracleParameter p1 = new OracleParameter("p1", OracleDbType.Clob);
p1.Value = data;
cmd.Parameters.Add(p1);
try
{
     conn.Open();
     cmd.ExecuteNonQuery();
}
catch (Exception ex)
{

     Console.WriteLine(ex);
}

参考:

https://www.cnblogs.com/guohu/p/8385620.html   

https://www.cnblogs.com/kerrycode/p/3796600.html  

 好了,本文到此结束,如果本文对你有帮助,资助2毛钱作为鼓励呗,穷逼一个,就当筹个网费吧

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zxy2847225301

测试使用

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

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

打赏作者

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

抵扣说明:

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

余额充值