sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo usar un cursor de referencia de Oracle de C# ODP.NET como parámetro ReturnValue, sin usar una función o procedimiento almacenado?

Intentaré una respuesta en lugar de otro comentario.

Como dije en un comentario, una declaración de selección pura/simple no funciona en PL/SQL. Pero me equivoqué al afirmar que necesita una función almacenada para devolver un cursor de referencia.

Pero lo primero es lo primero:el tipo "id_array" que declara en su bloque PL/SQL es un tipo PL/SQL. No se puede usar en una declaración de selección de cursor de referencia. En su lugar, necesitará un tipo de SQL:

create type id_array as table of number;

Esto debe ejecutarse solo una vez, como "crear tabla".

Su bloque PL/SQL podría verse así:

DECLARE
    t_ids   id_array;
BEGIN
    UPDATE WorkerStatus
    SET
         StateId = :StateId
        ,StateReasonId = :StateReasonId
    WHERE
        StateId = :CurrentStateId
    RETURNING Id BULK COLLECT INTO t_Ids;

    OPEN :rcursor FOR SELECT * FROM TABLE(cast(t_Ids as id_array));    
END;

PD:
Mientras armaba esta publicación, me di cuenta de dónde podría provenir el ORA-00942. La matriz t_ids se basó en un tipo PL/SQL, que no se conoce ni está disponible en el lado de SQL.