odp.net可以将参数传递给布尔pl/sql参数吗?

hay*_*eld 4 c# oracle plsql odp.net oracle11g

是否可以将一个OracleParameter正确传递给pl/sql存储过程中的boolean参数?

JCa*_*ico 9

我使用以下解决方法来绕过此限制:

  1. 使用匿名块包装函数调用.
  2. 返回包含1或0的输出变量.
  3. 读取输出变量并将其强制转换为boolean.

以下是一些示例代码:

using (var connection = new OracleConnection("<connection string>"))
{
    var command = new OracleCommand();
    command.Connection = connection;
    command.CommandText = 
        "declare v_bool boolean;" + 
        "begin " +
        "v_bool := auth_com.is_valid_username (:username); "+
        "if (v_bool = TRUE) then select 1 into :v_result from dual; end if; " +
        "if (v_bool = FALSE) then select 0 into :v_result from dual; end if; " +
        "end;";

    command.Parameters.Add(new OracleParameter { ParameterName = "username", OracleDbType = OracleDbType.NVarchar2, Size=512, Direction = ParameterDirection.Input });
    command.Parameters.Add(new OracleParameter { ParameterName = "v_result", OracleDbType = OracleDbType.Decimal, Direction = ParameterDirection.Output });     

    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    finally
    {
        connection.Close();
    }

    bool success = Convert.ToBoolean(((OracleDecimal)command.Parameters["v_result"].Value).ToInt32());
}
Run Code Online (Sandbox Code Playgroud)

编辑:

来自Oracle的Alex Keh,2013年10月:

我们计划在短期内支持托管提供商的ODP.NET布尔,可能在明年年中.


Ren*_*ene 4

您不能在 SQL 中使用布尔参数。因此,调用接受或返回布尔值的存储过程在 SQL 中不起作用。在 pl/sql 块内使用这样的过程没有问题。

添加了 JCallico 的答案:

我使用以下解决方法来绕过此限制:

  1. 使用匿名块包装函数调用。
  2. 返回包含 1 或 0 的输出变量。
  3. 读取输出变量并将其转换为布尔值。

这是一些示例代码:

using (var connection = new OracleConnection("<connection string>"))
{
    var command = new OracleCommand();
    command.Connection = connection;
    command.CommandText = 
        "declare v_bool boolean;" + 
        "begin " +
        "v_bool := auth_com.is_valid_username (:username); "+
        "if (v_bool = TRUE) then select 1 into :v_result from dual; end if; " +
        "if (v_bool = FALSE) then select 0 into :v_result from dual; end if; " +
        "end;";

    command.Parameters.Add(new OracleParameter { ParameterName = "username", OracleDbType = OracleDbType.NVarchar2, Size=512, Direction = ParameterDirection.Input });
    command.Parameters.Add(new OracleParameter { ParameterName = "v_result", OracleDbType = OracleDbType.Decimal, Direction = ParameterDirection.Output });     

    try
    {
        connection.Open();
        command.ExecuteNonQuery();
    }
    finally
    {
        connection.Close();
    }

    bool success = Convert.ToBoolean(((OracleDecimal)command.Parameters["v_result"].Value).ToInt32());
}
Run Code Online (Sandbox Code Playgroud)

编辑:

Oracle 的Alex Keh ,2013 年 10 月:

我们计划在短期内(可能是明年年中)在托管提供商中支持 ODP.NET Boolean。