代码之家  ›  专栏  ›  技术社区  ›  Ahmad

如何调用返回BOOLEAN值的Oracle存储函数?

  •  0
  • Ahmad  · 技术社区  · 8 年前

    我创建了一个测试包,其中包含一个不接受输入参数并返回布尔值的函数。功能体由单个 RETURN TRUE 为了简化这个问题。

    在VB.Net中,我成功地调用了该函数,但是,我总是遇到异常 PLS-00382: expression is of wrong type . 在我的vb代码中,我创建一个参数并将其方向设置为 ReturnValue 及其 DbType Int16 存储布尔结果(因为在 Db类型 结构)。那不管用,所以我试着 Double 然后 Decimal 然后 Long Varchar2 但它们都引起了相同的异常。

    我在这里做错了什么?

    包装规格

    CREATE OR REPLACE PACKAGE TEST_PKG AS 
       FUNCTION GET_TEST_VAL RETURN BOOLEAN;
    END TEST_PKG;
    

    ,

    包装主体

    CREATE OR REPLACE PACKAGE BODY TEST_PKG AS
       FUNCTION GET_TEST_VAL RETURN BOOLEAN IS
       BEGIN
         RETURN TRUE;
       END GET_TEST_VAL;
    END TEST_PKG;
    

    ,

    vb.net代码

    Dim con As New OracleConnection("Data Source=test_db;user id=scott;password=123456")
    Dim cmd As OracleCommand = con.CreateCommand()
    cmd.CommandText = "TEST_PKG.GET_TEST_VAL"
    
    Dim ret_val As New OracleParameter
    ret_val.Direction = ParameterDirection.ReturnValue
    ret_val.DbType = OracleDbType.Int16 '//<-- I tried varchar2, decimal, long, double'
    cmd.Parameters.Add(ret_val)
    cmd.CommandType = CommandType.StoredProcedure
    
    cmd.ExecuteNonQuery()  '//<-- This raises an Exception (PLS-00382: expression is of wrong type)'
    
    Console.WriteLine("Return Value = " & ret_val.Value.ToString)
    
    con.Close()
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Ilia Maskov    8 年前

    不支持PL\SQL BOOLEAN 键入一些数据提供程序(我不知道您使用哪一个)。通常的解决方法是使用 NUMBER 而不是在代码中。如果您必须使用第三方规则,并且您无法更改它们,则应将您的呼叫封装在匿名块中,如下所示:

    BEGIN
        :ret := CASE third_party_proc_call WHEN true THEN 1 ELSE 0 END;
    END;