Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader 步骤出错
Posted
技术标签:
【中文标题】Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader 步骤出错【英文标题】:Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: numeric or value error: character string buffer too small. Error at ExecuteReader step 【发布时间】:2017-03-09 16:54:04 【问题描述】:我在尝试执行查询时遇到以下错误:
Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或 值错误:字符串缓冲区太小
抛出异常的代码如下所示:
OracleConnection ocnn = (OracleConnection)this.Session.Connection;
using (OracleCommand command = ocnn.CreateCommand())
string getFieldValuesQuery =
"SELECT FIELD_NAME"
+ "FROM FIELD_VALUES WHERE FIELD_GUID in (select ID from table(f_parse_as_table(:fieldIds)) tab ) "
+ "AND DOCUMENT_GUID in (select ID from table(f_parse_as_table(:documentIds)) tab ) "
+ "AND RESOURCE_STATUS != 'DEL' ";
// value is a string which have 55 characters lenght
if (value != null)
getFieldValuesQuery += "AND TEXT_VALUE in (select ID from table(f_parse_as_table(:valuesIn)) tab ) ";
command.CommandText = getFieldValuesQuery;
command.BindByName = true;
OracleParameter fieldIdParameter = new OracleParameter();
OracleParameter documentIdParameter = new OracleParameter();
//OracleParameter valuesInParameter = new OracleParameter();
OracleParameter valuesInParameter = new OracleParameter("valuesIn", OracleDbType.Varchar2, 2000, ParameterDirection.Input);
fieldIdParameter.ParameterName = "fieldIds";
fieldIdParameter.OracleDbType = OracleDbType.Clob;
fieldIdParameter.Direction = ParameterDirection.Input;
fieldIdParameter.Value = string.Join(",", fieldIds);
documentIdParameter.ParameterName = "documentIds";
documentIdParameter.OracleDbType = OracleDbType.Clob;
documentIdParameter.Direction = ParameterDirection.Input;
documentIdParameter.Value = string.Join(",", documentIds);
command.Parameters.Add(fieldIdParameter);
command.Parameters.Add(documentIdParameter);
if (value != null)
//valuesInParameter.ParameterName = "valuesIn";
//valuesInParameter.OracleDbType = OracleDbType.Varchar2;
//valuesInParameter.Direction = ParameterDirection.Input;
valuesInParameter.Value = string.Join(",", value);
command.Parameters.Add(value);
returnList = this.ExecuteReader(command);
我知道这里有人问过类似的答案,但它们对我没有帮助。根据this问题我设置了oracle参数的长度。
如果value
的长度小于或等于 50 个字符,则一切正常。我不知道这个限制出现在哪里。这很奇怪,因为我的 value 文件在表定义中有VARCHAR2
类型,并且长度为 2000 个字符。
调用ExecuteReader
方法时引发错误。
【问题讨论】:
您正在调用数据库中名为 f_parse_as_table() 的函数。我猜这个函数接受一个 VARCHAR2(50),这就是为什么它在参数小于或等于 50 个字符时起作用。 @unleashed 你能把它写成答案吗?它帮助了我。 复制评论作为答案。祝你好运! 【参考方案1】:您正在调用数据库中名为 f_parse_as_table() 的函数。我猜这个函数接受一个 VARCHAR2(50),这就是为什么它在参数小于或等于 50 个字符时起作用的原因。
【讨论】:
以上是关于Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader 步骤出错的主要内容,如果未能解决你的问题,请参考以下文章
Oracle.DataAccess.Client.OracleConnection.Open()报错System. NullReferenceException
无法将“System.String”类型的对象转换为 C# 中的“Oracle.DataAccess.Client.OracleParameter”类型
Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常
错误 47 存储区提供程序工厂类型“Oracle.DataAccess.Client.OracleClientFactory”未实现 IServiceProvi
Oracle.DataAccess.Client.OracleException ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader 步骤出错
用iis发布应用连接oracle,系统报Oracle.DataAccess.Client.OracleConnection的类型初始值设定项引发异常