Can odp.net pass a parameter to a boolean pl/sql parameter?

前端 未结 2 1705
暖寄归人
暖寄归人 2020-12-11 06:18

Is it possible to correctly pass an OracleParameter to a boolean parameter in a pl/sql stored procedure?

相关标签:
2条回答
  • 2020-12-11 07:01

    I used the following workaround to bypass this limitation:

    1. Wrap the function call using an anonymous block.
    2. Return an output variable containing 1 or 0.
    3. Read the output variable and cast it to boolean.

    Here is some sample code:

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

    EDIT:

    Alex Keh from Oracle, october 2013:

    We're planning on supporting ODP.NET Boolean in the managed provider in the near term, possibly in the middle of next year.

    0 讨论(0)
  • 2020-12-11 07:05

    You can not use boolean parameters in SQL. So calling an stored procedure that takes or returns a boolean value won't work in SQL. There is no problem using such a procedure from within a pl/sql block.

    ADDED from JCallico answer:

    I used the following workaround to bypass this limitation:

    1. Wrap the function call using an anonymous block.
    2. Return an output variable containing 1 or 0.
    3. Read the output variable and cast it to boolean.

    Here is some sample code:

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

    EDIT:

    Alex Keh from Oracle, october 2013:

    We're planning on supporting ODP.NET Boolean in the managed provider in the near term, possibly in the middle of next year.

    0 讨论(0)
提交回复
热议问题