Estoy tratando de ejecutar una función de Oracle definida por el usuario que devuelve un RefCursor usando ODP.NET. Aquí está la función:¿Cómo devolver un RefCursor desde la función de Oracle?
CREATE OR REPLACE FUNCTION PKG.FUNC_TEST (ID IN TABLE.ID%type)
RETURN SYS_REFCURSOR
AS
REF_TEST SYS_REFCURSOR;
BEGIN
OPEN REF_TEST FOR
SELECT *
FROM TABLE;
RETURN REF_TEST;
END;
/
puedo llamar a esta función en sapo (seleccione func_test (7) de la doble) y volver a un cursor. Pero necesito obtener el cursor usando C# y ODP.NET para llenar un DataSet, pero sigo obteniendo una NullReferenceException - "Referencia de objeto no configurada para una instancia de un objeto". Aquí es lo que tengo para ello:
OracleConnection oracleCon = new OracleConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
OracleCommand sqlCom = new OracleCommand("select func_test(7) from dual", oracleCon);
sqlCom.Parameters.Add("REF_TEST", OracleDbType.RefCursor, ParameterDirection.ReturnValue);
OracleDataAdapter dataAdapter = new OracleDataAdapter();
dataAdapter.SelectCommand = sqlCom;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet); //FAILS HERE with NullReferenceException
yo era capaz de encontrar un montón de información y muestras sobre el uso de procedimientos almacenados y ODP.NET, pero no tanto para el retorno de RefCursors de funciones.
EDIT: no quiero añadir explícitamente los parámetros de entrada al objeto OracleCommand (es decir sqlCom.Parameters.Add("id", OracleDbType.Int32,ParameterDirection.Input).Value = 7;
) como que hace que sea difícil implementar esto como un servicio web REST genérica, pero estoy reservando como mi último recurso pero usaría procedimientos almacenados en su lugar.
¡Cualquier ayuda es muy apreciada!
Está agregando un parámetro pero lo está ejecutando como una consulta; ¿No quieres hacer algo como ': REF_TEST: = func_test (7)'? –
No estoy seguro de dónde usar esto. ¿Se usa esto en lugar del parámetro? – Gady
como la cadena OracleCommand, en lugar de la selección. (Tal vez debería señalar que no sé nada de ODP.Net, pero todavía se ve mal * 8-) –