调用批量合并时的ORA-12537-Oracle.ManagedDataAccess.Client

本文关键字:ORA-12537-Oracle ManagedDataAccess Client 合并 调用 | 更新日期: 2023-09-27 17:58:38

我正在尝试使用ArrayBindCount插入/更新许多记录。

它适用于1条和2条记录,但如果我尝试插入3或更多,则会出现ORA-12537异常。

我使用的是Oracle.ManagedDataAccess.dll版本4.121.1.0。我还试用了OracleXE 11gOracle Standard 11g

这是我正在使用的sql:

MERGE INTO tb_medidor_ene t1 
USING (select :pId cd_medidor, :pDate dt_hr_instante, :pValor vl_eneat_del from dual) t2 ON (t1.cd_medidor = t2.cd_medidor and t1.dt_hr_instante = t2.dt_hr_instante) 
WHEN MATCHED THEN update set t1.vl_eneat_del = t2.vl_eneat_del, dt_hr_insercao = :pInsertDate 
WHEN NOT MATCHED THEN INSERT (t1.cd_medidor, t1.dt_hr_insercao, t1.dt_hr_instante, t1.vl_eneat_del) 
VALUES (t2.cd_medidor, :pInsertDate, t2.dt_hr_instante, t2.vl_eneat_del)

这个(简化的)代码:

    int num = 3;
    int index;
    var ids = new int[num];
    var insertDates = new DateTime[num];
    var dates = new DateTime[num];
    var values = new double[num];
    for (index = 0; index < num; index++) {
        ids[index] = 1;
        insertDates[index] = DateTime.Now;
        dates[index] = DateTime.Today.AddMinutes(index * 5);
        values[index] = index;
    }
    using (var conn = new OracleConnection(Program.ConnString)) {
        conn.Open();
        using (var command = conn.CreateCommand()) {
            command.ArrayBindCount = num;
            command.CommandText = sql;
            command.BindByName = true;
            command.Parameters.Add(new OracleParameter("pId", ids));
            command.Parameters.Add(new OracleParameter("pInsertDate", insertDates));
            command.Parameters.Add(new OracleParameter("pDate", dates));
            command.Parameters.Add(new OracleParameter("pValor", values));
            command.ExecuteNonQuery();
        }
    }

"Oracle.ManagedDataAccess.dll中发生类型为"Oracle.MManagedDataAccess.Client.OracleException"的未经处理的异常"

{"ORA-12537:重新设计书目:Fim do arquivo"}

堆栈跟踪:

位于Oracle.ManagedDataAccess.Client.OracleException.HandleError(OracleTraceLevel级别,OracleTraceTag标记,Exception ex)在OracleInternal.TTC.TTCExecuteSql.ReceiveExecuteResponse(访问器[]和定义访问器,访问器[]绑定访问器,布尔bHasReturningParams,SQLMetaData和SQLMetaData,SqlStatementType语句类型,Int64 noOfRowsFetchedLastTime,Int32 noOfRowsToFetch,Int32&noOfRowsFetched,Int64和queryId,Int32 longFetchSize,Int32 initialLOBFetchSizescnFromExecution,布尔型&bAllPureInputBinds,DataUnmarshaller&dataUnmarshaller,MarshalBindParameterValueHelper&marshallBindParamsHelper,布尔bDefinitionOne)位于OracleInternal.ServiceObjects.OracleCommandImpl.ExecuteNonQuery(String commandText,OracleParameterCollection paramColl,CommandType CommandType,OracleConnectionImpl connectionImpl,Int32 longFetchSize,Int32 lobPrefetchSize,OracleDependencyImpl orclDependencyImpl,Int64[]&scnFromExecution,OracleParameterCollection&bindByPositionParamColl,布尔型&bBindParamPresent,布尔值为FromEF)位于Oracle.ManagedDataAccess.Client.OracleCommand.ExecuteNonQuery()位于c:''dev''way2''DataIn''OraclePlayground''OraclePlayground''Program.cs:line 114中的OraclePlayground.Program.Main(String[]args)位于System.AppDomain_nExecuteAssembly(RuntimeAssembly程序集,String[]参数)位于System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity,String[]args)位于Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()位于System.Threading.ThreadHelper.ThreadStart_Context(对象状态)位于System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext,ContextCallback回调,对象状态,布尔值preserveSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,Object state,Boolean preserveSyncCtx)在System.Threading.ExecutionContext.Run(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)在System.Threading.ThreadHelper.ThreadStart()

调用批量合并时的ORA-12537-Oracle.ManagedDataAccess.Client

对于有同样问题的人:

我最终创建了一个存储过程,它什么也不做,只执行我试图直接执行的SQL。

然后,您可以批量调用该过程,它运行良好。

到目前为止,这是唯一的方法,直到甲骨文的人解决了这个问题。

我也遇到了类似的问题。合并的项目导致ORA-12537错误。这很奇怪,因为它工作了一段时间,然后就没有了。我最终将它缩小到CLOB字段中的空值。如果CLOB只有一个值为空,它就会工作,但如果有多个值,它就会一直失效。我通过将其更改为在CLOB中放入一个空间来解决此问题(即使使用"也会导致错误)。浪费了一个空间,但至少错误已经消失了。

这对我来说似乎是个bug。我在本地运行Oracle 11.2.0.3.0 64位。希望这能帮助。。。