odp.net可以将参数传递给布尔pl / sql参数吗?

是否可以正确地将OracleParameter传递给pl / sql存储过程中的布尔参数?

您不能在SQL中使用布尔参数。 因此,调用获取或返回布尔值的存储过程在SQL中不起作用。 在pl / sql块中使用这样的过程没有问题。

来自JCallico的回答:

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

  1. 使用匿名块包装函数调用。
  2. 返回包含1或0的输出变量。
  3. 读取输出变量并将其转换为boolean。

以下是一些示例代码:

using (var connection = new OracleConnection("")) { 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()); } 

编辑:

来自Oracle的Alex Keh ,2013年10月:

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

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

  1. 使用匿名块包装函数调用。
  2. 返回包含1或0的输出变量。
  3. 读取输出变量并将其转换为boolean。

以下是一些示例代码:

 using (var connection = new OracleConnection("")) { 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()); } 

编辑:

来自Oracle的Alex Keh ,2013年10月:

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