是否可以正确地将 OracleParameter 传递给 pl/sql 存储过程中的布尔参数?
问问题
8797 次
2 回答
10
我使用以下解决方法来绕过此限制:
- 使用匿名块包装函数调用。
- 返回包含 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());
}
编辑:
来自 Oracle 的Alex Keh ,2013 年 10 月:
我们计划在短期内(可能在明年年中)在托管提供程序中支持 ODP.NET Boolean。
于 2010-12-07T15:33:11.383 回答
4
您不能在 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());
}
编辑:
来自 Oracle 的Alex Keh ,2013 年 10 月:
我们计划在短期内(可能在明年年中)在托管提供程序中支持 ODP.NET Boolean。
于 2010-06-23T07:54:45.633 回答