Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser un curseur de référence Oracle de C # ODP.NET en tant que paramètre ReturnValue, sans utiliser de fonction ou de procédure stockée ?

Je vais essayer une réponse au lieu d'un autre commentaire.

Comme je l'ai dit dans un commentaire, une instruction select pure/simple ne fonctionne pas en PL/SQL. Mais j'ai eu tort de dire que vous avez besoin d'une fonction stockée pour renvoyer un curseur de référence.

Mais tout d'abord :le type "id_array" que vous déclarez dans votre bloc PL/SQL est un type PL/SQL. Il ne peut pas être utilisé dans une instruction de sélection de curseur de référence. Au lieu de cela, vous aurez besoin d'un type SQL :

create type id_array as table of number;

Cela ne doit être exécuté qu'une seule fois, tout comme une "création de table".

Votre bloc PL/SQL pourrait alors ressembler à ceci :

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 :
En assemblant ce post, j'ai réalisé d'où pouvait provenir l'ORA-00942. Le tableau t_ids était basé sur un type PL/SQL, qui n'est pas connu/disponible côté SQL.