使用INSERT ... RETURNING子句导致ORA-12537

时间:2017-01-24 20:39:23

标签: c# oracle odp.net-managed

问题与问题主题中所述的一样简单。我尝试使用INSERT...RETURNING子句运行一些查询,当我尝试执行它时,它会引发ORA-12537异常。来源如下:

using ( OracleCommand command = new OracleCommand () ) {
    command.Connection = connection;
    command.BindByName = true;
    command.CommandText = "INSERT INTO objects(name)VALUES(:objectName)RETURNING id INTO :objectId";
    command.Parameters.Add ( "objectName", OracleDbType.Varchar2, ParameterDirection.Input );
    command.Parameters.Add ( "objectId", OracleDbType.Int64, ParameterDirection.Output );
    command.ExecuteNonQuery ();
}

执行最后一行会导致使用消息ORA-12537: Network Session: End of file引发OracleException。没有RETURNING子句运行相同的查询显然很顺利。

2 个答案:

答案 0 :(得分:2)

OracleCommand.CommandText属性设置要执行的SQL语句或存储过程 ORA-12537仅是一条信息消息,表示连接已关闭。这可能是由多种原因造成的,即i.a. oracle无法正确执行sql语句并终止会话。

尝试将语句作为pl / sql块执行,而不是在纯sql上下文中执行:

command.CommandText = @"
    begin 
        insert into objects(name) values(:objectName) returning id into :objectId; 
    end;";

答案 1 :(得分:2)

我也遇到了同样的问题,最初使用@ 0xdb解决方案,它起作用了。 然后,我发现 ParameterDirection 应该是 ReturnValue ,而不是 Output ,并且一切正常。

using ( OracleCommand command = new OracleCommand () ) {
    command.Connection = connection;
    command.BindByName = true;
    command.CommandText = "INSERT INTO objects(name)VALUES(:objectName)RETURNING id INTO :objectId";
    command.Parameters.Add ( "objectName", OracleDbType.Varchar2, ParameterDirection.Input );
    command.Parameters.Add ( "objectId", OracleDbType.Int64, ParameterDirection.ReturnValue);
    command.ExecuteNonQuery ();
}