2010-06-23 119 views

回答

2

您不能在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()); 
} 

编辑:

亚历KEH从甲骨文,2013年10月:

我们正在支持ODP.NET计划近期内管理提供商 中的布尔值,可能在明年年中。

+0

是否有解决方法?我可以通过其他类型吗? – haymansfield 2010-06-23 08:07:50

+0

您可以重新定义您的程序,使其取Y/N值或1/0。随你喜欢。 – Rene 2010-06-23 09:02:46

+0

有些时候,修改原始功能不是一个选项。请参阅下面的解决方法。 – JCallico 2010-12-07 15:34:02

9

我使用以下解决方法来绕过此限制:

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

编辑:

亚历KEH从甲骨文,2013年10月:

我们正在支持ODP.NET计划近期内管理提供商 中的布尔值,可能在明年年中。

+0

这可能派上用场,thx – sehe 2011-04-04 09:20:48

+0

也许函数包diutil:sys.diutil.int_to_bool和sys.diutil.bool_to_int。需要架构权限。 – Kiquenet 2013-10-30 13:59:00

+0

您的代码需要有关匿名块的权限。 – Kiquenet 2013-10-30 13:59:34

相关问题