2009-07-31 7 views
0

J'utilise ODP.NET (migration depuis le fournisseur Microsoft) et je suis bloqué sur une procédure stockée qui renvoie un refcursor. Je les éléments suivants Procédure PL/SQL (Je l'ai changé un peu pour le rendre plus général):Problème de paramètre avec Oracle RefCursor

PROCEDURE MyProc(parameter_no1 IN NUMBER, parameter_no2 IN NUMBER, RETCURSOR OUT ret_type) AS 
BEGIN 
    OPEN RETCURSOR FOR 
    SELECT ad.logo logo 
    FROM tab_a a, tab_h h 
    WHERE a.id IS NOT NULL 
    AND a.h_id = h.id 
    AND a.no1 = parameter_no1 
    AND a.no2= parameter_no2; 
END HanteraLogotype; 

Et puis je le folloing code C# pour l'appeler:

internal void RefCursorDataReader() 
{ 
    OracleCommand cmd = new OracleCommand("ABC$MYPACKAGE.MyProc", new OracleConnection(_constr)); 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Connection.Open(); 
    cmd.BindByName = true; 

    OracleParameter p = cmd.Parameters.Add("parameter_no1", OracleDbType.Decimal); 
    p.Value = 12345678; 
    p.Direction = ParameterDirection.Input; 

    p = cmd.Parameters.Add("parameter_no2", OracleDbType.Decimal); 
    p.Value = 123456; 
    p.Direction = ParameterDirection.Input; 

    p = cmd.Parameters.Add("RETCURSOR", OracleDbType.RefCursor); 
    p.Direction = ParameterDirection.Output; 

    OracleDataReader reader = cmd.ExecuteReader(); 

    if (reader.Read()) 
    { 
    System.Diagnostics.Debug.WriteLine(reader[0].GetType().ToString()); 
    } 

    cmd.Connection.Close(); 
} 

Et quand je lance, je continue à obtenir cette exception:

ORA-03106: erreur fatale de protocole de communication à deux tâches

J'ai essayé de nombreuses variantes de paramètres, leur type, leur ordre, etc., mais rien ne semble les aider. C'est l'reader.Read() qui lance l'exception. J'apprécierais vraiment l'aide sur celui-ci!

Ajouté: le ret_type est défini comme:

ret_type TYPE EST REF CURSOR;

+0

Le type de logo est LONG RAW , et cela semble être le problème. Si je le change en nombre, ça marche. – kaze

+0

Ah, les types de données LONG ont été dépréciés dans Oracle 8, je crois. LOB les a remplacés. –

Répondre

1

Cela ressemble à un bogue. L'erreur 3106 est une erreur grave qui ne devrait jamais arriver. Je suis sûr qu'il y a une solution de rechange si !!

Le meilleur endroit pour poser des questions ODP.NET est sur le forum OTN ODP.NET. Si j'étais vous, je poste ce là-bas:

http://forums.oracle.com/forums/forum.jspa?forumID=146&start=0

également rechercher ce forum particulier pour "3106"

0

je suis passé à 11G ODP.NET

Questions connexes