如何调用返回 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
然后 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()
一些数据提供者不支持PL\SQL BOOLEAN
类型(我不知道你用的是哪一个)。通常的解决方法是在您的代码中使用 NUMBER
代替。如果你必须使用第三方例程并且你不能改变它们,你应该像这样将你的调用包装在匿名块中:
BEGIN
:ret := CASE third_party_proc_call WHEN true THEN 1 ELSE 0 END;
END;
我创建了一个测试包,其中包含一个不带输入参数的函数和 returns BOOLEAN。为了简化这个问题,函数体由单个 RETURN TRUE
语句组成。
在VB.Net中,我成功调用了函数,但是,我总是遇到异常PLS-00382: expression is of wrong type
。
在我的 vb 代码中,我创建了一个参数并将其方向设置为 ReturnValue
并将其 DbType
设置为 Int16
以存储布尔结果(因为没有本地布尔类型DbType
结构)。那没有用,所以我尝试了 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()
一些数据提供者不支持PL\SQL BOOLEAN
类型(我不知道你用的是哪一个)。通常的解决方法是在您的代码中使用 NUMBER
代替。如果你必须使用第三方例程并且你不能改变它们,你应该像这样将你的调用包装在匿名块中:
BEGIN
:ret := CASE third_party_proc_call WHEN true THEN 1 ELSE 0 END;
END;