对于这个问题,网上也有很多的文章有介绍,但总是差了那么一点点,如: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毛钱作为鼓励呗,穷逼一个,就当筹个网费吧