【发布时间】:2011-03-07 04:52:36
【问题描述】:
是否可以正确地将 OracleParameter 传递给 pl/sql 存储过程中的布尔参数?
【问题讨论】:
标签: c# oracle plsql oracle11g odp.net
是否可以正确地将 OracleParameter 传递给 pl/sql 存储过程中的布尔参数?
【问题讨论】:
标签: c# oracle plsql oracle11g odp.net
我使用以下解决方法来绕过此限制:
这里是一些示例代码:
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());
}
编辑:
Alex Keh,来自 Oracle,2013 年 10 月:
我们计划在托管提供程序中支持 ODP.NET 布尔值 近期,可能在明年年中。
【讨论】:
您不能在 SQL 中使用布尔参数。所以调用一个接受或返回布尔值的存储过程在 SQL 中是行不通的。在 pl/sql 块中使用这样的过程没有问题。
来自 JCallico 答案:
我使用以下解决方法来绕过此限制:
这里是一些示例代码:
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());
}
编辑:
Alex Keh,来自 Oracle,2013 年 10 月:
我们计划在托管提供程序中支持 ODP.NET 布尔值 近期,可能在明年年中。
【讨论】: