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

不问归期 提交于 2019-11-27 07:13:14

问题


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


回答1:


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.




回答2:


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.



来源:https://stackoverflow.com/questions/3099833/can-odp-net-pass-a-parameter-to-a-boolean-pl-sql-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!