Нельзя использовать логические параметры в SQL. Поэтому вызов хранимой процедуры, которая принимает или возвращает логическое значение, не будет работать в SQL. Нет проблем с использованием такой процедуры из блока pl / sql.
ДОБАВЛЕНО от JCallico ответ:
Я использовал следующий обходной путь, чтобы обойти это ограничение:
- Обернуть вызов функции анонимным блоком.
- Возвращает выходную переменную, содержащую 1 или 0.
- Считать выходную переменную и привести ее к логическому значению.
Вот пример кода:
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 в управляемом провайдере.
в ближайшее время, возможно, в середине следующего года.