Oracle
 sql >> Database >  >> RDS >> Oracle

Come utilizzare un cursore di riferimento Oracle da C# ODP.NET come parametro ReturnValue, senza utilizzare una funzione o una procedura memorizzata?

Proverò una risposta invece di un altro commento.

Come ho detto in un commento, un'istruzione select pura/semplice non funziona in PL/SQL. Ma ho sbagliato ad affermare che è necessaria una funzione memorizzata per restituire un cursore di riferimento.

Ma prima di tutto:il tipo "id_array" che dichiari nel tuo blocco PL/SQL è un tipo PL/SQL. Non può essere utilizzato in un'istruzione di selezione del cursore di riferimento. Invece avrai bisogno di un tipo SQL:

create type id_array as table of number;

Questo deve essere eseguito solo una volta, proprio come una "crea tabella".

Il tuo blocco PL/SQL potrebbe quindi assomigliare a questo:

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;

PS:
Durante l'assemblaggio di questo post, mi sono reso conto da dove potrebbe provenire l'ORA-00942. L'array t_ids era basato su un tipo PL/SQL, che non è noto/disponibile sul lato SQL.