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的类型初始值设定项引发异常