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

How can I call a Oracle stored function returning BOOLEAN value?

我创建了一个测试包,其中包含一个不带输入参数的函数和 returns BOOLEAN。为了简化这个问题,函数体由单个 RETURN TRUE 语句组成。

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

我做错了什么?

包装规格

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()

一些数据提供者不支持PL\SQL BOOLEAN类型(我不知道你用的是哪一个)。通常的解决方法是在您的代码中使用 NUMBER 代替。如果你必须使用第三方例程并且你不能改变它们,你应该像这样将你的调用包装在匿名块中:

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