2010-08-10 13 views
2

J'essaie d'exécuter une procédure qui renvoie une procédure stockée. Ma version d'Oracle DB est 9.2 et la version ODP .NET est 10.2.0.100ODP .NET Obtenir une sortie SYSREFCURSOR. {Erreur "type de colonne non pris en charge"}

Mon code C# ressemble à ceci.

OracleCommand od = new OracleCommand(); 
od.Connection = oc; 
OracleParameter opBranchNo; 
OracleParameter opSysRef; 
od.CommandType = System.Data.CommandType.StoredProcedure; 
od.CommandText = "pkg_fetchleaseinfo.proc_fetchleaseheader"; 

opBranchNo = new OracleParameter("IBRANCH_ID", OracleDbType.Varchar2, 3, "044"); 
opBranchNo.Direction = System.Data.ParameterDirection.Input; 
od.Parameters.Add(opBranchNo); 

opSysRef = new OracleParameter(); 
opSysRef.ParameterName = "REC_SET"; 
opSysRef.Direction = System.Data.ParameterDirection.Output; 
opSysRef.OracleDbType = OracleDbType.RefCursor; 
od.Parameters.Add(opSysRef); 
od.Prepare(); 
od.ExecuteNonQuery(); 
Oracle.DataAccess.Types.OracleRefCursor sysref = 
    (Oracle.DataAccess.Types.OracleRefCursor)opSysRef.Value; 
return sysref.GetDataReader(); 
//OracleDataReader dr1 = 
//((Oracle.DataAccess.Types.OracleRefCursor)opSysRef.Value).GetDataReader(); 
//return dr1; 

Mon code Oracle procédure ressemble à ce

PROCEDURE proc_fetchleaseheader(ibranch_id IN VARCHAR2, 
    rec_set OUT SYS_REFCURSOR) IS x_rec genericCursor; 
BEGIN 
    OPEN x_rec FOR SELECT getleaseheaderrows(ibranch_id) FROM dual; 
    rec_set := x_rec; 
EXCEPTION WHEN OTHERS THEN  
    RAISE; 
END; 

Lorsque j'exécute mon code, la partie où je tente un getReader() échoue avec un message d'erreur UNSUPPORTED COLONNE DATATYPE.

+0

Pour une raison quelconque, je n'ai pas pu formater le code de procédure stockée correctement – abhi

+0

'getleaseheaderrows (ibranch_id)' est une fonction définie par l'utilisateur. Quel type de données renvoie-t-il? Vos trucs ODP fonctionnent-ils si la procédure stockée appelle quelque chose de plus simple, comme 'select dummy from dual'? – APC

+0

getleaseheaderrows (ibranch_id) est une fonction qui retourne un REF CURSOR. Si j'essaye avec SELECT DUMMY FROM DUAL; la fonction renvoie une erreur qui ressemble à ceci. Erreur System.NullReferenceException: La référence d'objet n'est pas définie sur une instance de un objet. – abhi

Répondre

1

Je crois que vous ouvrez une refcursor de tenir un Sélectionnez [refcursor] de double

pourquoi ne pas seulement

PROCEDURE proc_fetchleaseheader(ibranch_id IN VARCHAR2, 
    rec_set OUT SYS_REFCURSOR) IS x_rec genericCursor; 
BEGIN 
    x_rec := getleaseheaderrows(ibranch_id); 
    rec_set := x_rec; 
/**EXCEPTION WHEN OTHERS THEN  --no need for this, the proc will raise just fine without being explicitly told to do so 
    RAISE; 
***/ 
END; 

ou mieux encore il suffit d'appeler getleaseheaderrows du côté .net et drop la procédure (rappelez-vous simplement pour les paramètres dans ODP toujours attend la valeur de retour de la fonction en tant que premier paramètre

+0

Savez-vous si les choses vont changer lorsque nous passons à une fonction PIPELINED? – abhi