Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 253
haymansfield Avatar asked Jun 23 '10 07:06

haymansfield


People also ask

Does PL SQL have Boolean?

Boolean values and variables are very useful in PL/SQL. Because a Boolean variable can only be TRUE, FALSE, or NULL, you can use that variable to explain what is happening in your code.

What are the 3 types of parameters in a PL SQL procedure?

PL/SQL procedure parameters can have one of three possible modes: IN, OUT, or IN OUT. PL/SQL function parameters can only be IN. An IN formal parameter is initialized to the actual parameter with which it was called, unless it was explicitly initialized with a default value.

How do you pass a Boolean value to a stored procedure in C#?

bool ss =True; toggleTrainingVisibilityByMfr(ss);

What is the use of out parameter in PL SQL?

An OUT parameter returns a value to the calling program. Inside the subprogram, an OUT parameter acts like a variable. You can change its value and reference the value after assigning it. The actual parameter must be variable and it is passed by value.


2 Answers

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.

like image 172
JCallico Avatar answered Sep 27 '22 23:09

JCallico


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.

like image 26
Rene Avatar answered Sep 27 '22 23:09

Rene