2016-03-06 5 views
0

Я создал тестовый пакет, содержащий единственную функцию, которая не принимает входных параметров и возвращает BOOLEAN. Тело функции состоит из одного заявления RETURN TRUE для упрощения этого вопроса.Как я могу вызвать хранимую функцию Oracle, возвращающую значение BOOLEAN?

В 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() 
+0

И какой поставщик данных вы используете? –

ответ

1

Там нет поддержки PL \ SQL BOOLEAN типа в некоторых провайдеров данных (я не знаю, какой из них вы используете). Обычным обходным решением является использование NUMBER вместо этого в вашем коде. Если вам нужно использовать сторонние рутины, и вы не можете их изменить, вы должны обменивать свои звонки в анонимный блок следующим образом:

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

 Смежные вопросы

  • Нет связанных вопросов^_^