2016-03-06 5 views
0

J'ai créé un paquet de test contenant une seule fonction qui ne prend aucun paramètre d'entrée et renvoie un BOOLEAN. Le corps de la fonction consiste en une seule instruction RETURN TRUE pour simplifier cette question.Comment puis-je appeler une fonction stockée Oracle renvoyant la valeur BOOLEAN?

Dans VB.Net, j'appelle avec succès la fonction, cependant, je reçois toujours une exception PLS-00382: expression is of wrong type. Dans mon code vb, je crée un paramètre et définissez sa direction à ReturnValue et DbType à Int16 pour stocker le résultat booléen (puisqu'il n'y a pas de type booléen natif dans la structure DbType). Cela n'a pas fonctionné, donc j'ai essayé Double puis Decimal puis Long et Varchar2 mais ils ont tous provoqué la même exception.

Qu'est-ce que je fais mal ici?

spécifications du paquet

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

,

corps de boîtier

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; 

,

code 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

Et quel fournisseur de données utilisez-vous? –

Répondre

1

Il n'y a pas de soutien PL \ SQL fournisseurs BOOLEAN type dans certaines données (je ne sais pas lequel vous utilisez). La solution de contournement habituelle consiste à utiliser NUMBER à la place dans votre code. Si vous devez utiliser des rutines tierces et que vous ne pouvez pas les modifier, vous devez envelopper vos appels dans un bloc anonyme comme ceci:

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