Cómo llamar al procedimiento almacenado de Oracle que devuelve el cursor de referencia

Estoy intentando llamar al procedimiento almacenado de Oracle que devuelve el cursor de referencia, y necesito generar una vista de árbol a partir de los datos devueltos. Soy nuevo en esto y tengo dos problemas.

El primer problema es que no puedo llamar a ese procedimiento. Recibo este error: “número incorrecto o tipos de argumentos en la llamada a ‘OBJECT_HIERARCHY'”

Y mi segundo problema es que no entiendo cómo obtendré esos datos cuando este procedimiento devuelva un valor de cursor de referencia. Hay más de 5000 registros en esa tabla y no obtengo esos datos, sino un valor de cursor de referencia. ¿Alguien puede explicar cómo puedo obtener esos datos con el valor del cursor de referencia? No tengo experiencia con Oracle.

Esta es la definición del procedimiento en oracle:

CREATE OR REPLACE PROCEDURE SAD.object_hierarchy (nAppId IN NUMBER, nParentId IN NUMBER DEFAULT -1, o_cRefCursor OUT SYS_REFCURSOR) IS BEGIN IF NOT o_cRefCursor%ISOPEN THEN OPEN o_cRefCursor FOR SELECT h.PARENT_ID, h.CHILD_ID, h.H_LEVEL, o.OBJECT_IDENTIFIER, o.OBJECT_TYPE_ID FROM ( SELECT PARENT_ID, CHILD_ID, LEVEL AS H_LEVEL FROM OBJECT_RELATIONSHIPS START WITH PARENT_ID = nParentId --> -1 --= 60170 CONNECT BY PRIOR CHILD_ID = PARENT_ID ) h INNER JOIN OBJECTS o ON o.OBJECT_ID = h.CHILD_ID AND O.APPLICATION_ID = nAppId; END IF; END object_hierarchy; 

Estas son las definiciones de los campos de la tabla.

 Column Name Data Type OBJECT_REL_ID NUMBER (14) PARENT_ID NUMBER (14) CHILD_ID NUMBER (14) OBJECT_IDENTIFIER VARCHAR2 (255 Byte) OBJECT_TYPE_ID VARCHAR2 (5 Byte) 

y este es mi código que devuelve error:

  string oradb = "Data Source=(DESCRIPTION=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=tnt33)(PORT=1521))" + "(CONNECT_DATA=(SERVICE_NAME=ORCL)));" + "User Id=xxx;Password=xxxxx;"; OracleConnection con = new OracleConnection(oradb); try { con.Open(); OracleCommand cmd = new OracleCommand(); cmd.Connection = con; cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "SAD.object_hierarchy"; cmd.Parameters.Add("nAppId", OracleDbType.Int16).Value = 1; OracleParameter oraP = new OracleParameter(); oraP.OracleDbType = OracleDbType.RefCursor; oraP.Direction = System.Data.ParameterDirection.Output; cmd.Parameters.Add(oraP); OracleDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { } reader.Close(); } catch (Exception ex) { con.Close(); } 

¿Puede alguien ayudarme y explicarme por qué mi código está devolviendo este error: “número o tipo de argumentos incorrectos en la llamada a ‘OBJECT_HIERARCHY'”

Si va a proporcionar el OUT , también deberá proporcionar nParentId porque .NET no va a nombrar esos parámetros cuando la statement se envía al servidor.

 cmd.Parameters.Add("nParentId", OracleDbType.Int16).Value = -1; 

Ejemplo:

 string connStr = "Data Source=datasource;Persist Security Info=True;User ID=user;Password=pass;Unicode=True"; DataSet dataset = new DataSet(); string connStr = ConfigurationManager.ConnectionStrings["OracleConn"].ToString(); using (OracleConnection objConn = new OracleConnection(connStr)) { OracleCommand objCmd = new OracleCommand(); objCmd.Connection = objConn; objCmd.CommandText = "Oracle_PkrName.Stored_Proc_Name"; objCmd.CommandType = CommandType.StoredProcedure; objCmd.Parameters.Add("Emp_id", OracleType.Int32).Value = 3; // Input id objCmd.Parameters.Add("Emp_out", OracleType.Cursor).Direction = ParameterDirection.Output; try { objConn.Open(); objCmd.ExecuteNonQuery(); OracleDataAdapter da = new OracleDataAdapter(objCmd); da.Fill(dataset); } catch (Exception ex) { System.Console.WriteLine("Exception: {0}", ex.ToString()); } objConn.Close(); }