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

Posted

技术标签:

【中文标题】odp.net 可以将参数传递给布尔 pl/sql 参数吗?【英文标题】:Can odp.net pass a parameter to a boolean pl/sql parameter? 【发布时间】:2011-03-07 04:52:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

    使用匿名块包装函数调用。 返回一个包含 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());

编辑:

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

我们计划在托管提供程序中支持 ODP.NET 布尔值 近期,可能在明年年中。

【讨论】:

也许函数包diutil:sys.diutil.int_to_bool和sys.diutil.bool_to_int。需要架构中的权限。【参考方案2】:

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

编辑:

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

我们计划在托管提供程序中支持 ODP.NET 布尔值 近期,可能在明年年中。

【讨论】:

您可以重新定义您的过程,使其采用 Y/N 值或 1/0。随心所欲。 有时不能修改原始功能。请参阅下面的解决方法。

以上是关于odp.net 可以将参数传递给布尔 pl/sql 参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL:将词法参数传递给存储过程

将 BLOB/CLOB 作为参数传递给 PL/SQL 函数

将值列表作为输入参数传递给 PL/SQL 过程

为啥这个 PL/SQL 查询不使用 ODP.NET 执行

使用 Mybatis 将布尔参数传递给存储过程

将参数传递给 callableSatament - ORA-01008: 并非所有变量都绑定