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

时间:2010-06-23 07:49:54

标签: c# oracle plsql oracle11g odp.net

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

2 个答案:

答案 0 :(得分:9)

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

  1. 使用匿名块包裹函数调用。
  2. 返回包含1或0的输出变量。
  3. 读取输出变量并将其强制转换为boolean。
  4. 以下是一些示例代码:

    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());
    }
    

    编辑:

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

      

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

答案 1 :(得分:2)

您不能在SQL中使用布尔参数。因此,调用获取或返回布尔值的存储过程将无法在SQL中运行。在pl / sql块中使用这样的过程没有问题。

从JCallico回答:

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

  1. 使用匿名块包裹函数调用。
  2. 返回包含1或0的输出变量。
  3. 读取输出变量并将其强制转换为boolean。
  4. 以下是一些示例代码:

    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());
    }
    

    编辑:

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

      

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