Может ли odp.net передать параметр в логический параметр pl / sql? - PullRequest
4 голосов
/ 23 июня 2010

Можно ли правильно передать параметр OracleParameter в логический параметр в хранимой процедуре pl / sql?

Ответы [ 2 ]

9 голосов
/ 07 декабря 2010

Я использовал следующий обходной путь, чтобы обойти это ограничение:

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

EDIT:

Алекс Кех от Oracle, октябрь 2013 г .:

Мы планируем поддерживать ODP.NET Boolean в управляемом провайдере. в ближайшее время, возможно, в середине следующего года.

2 голосов
/ 23 июня 2010

Нельзя использовать логические параметры в 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());
}

EDIT:

Алекс Кех от Oracle, октябрь 2013 г .:

Мы планируем поддерживать ODP.NET Boolean в управляемом провайдере. в ближайшее время, возможно, в середине следующего года.

...