Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie verwende ich einen Oracle Ref-Cursor aus C# ODP.NET als ReturnValue-Parameter, ohne eine gespeicherte Funktion oder Prozedur zu verwenden?

Ich werde versuchen, eine Antwort anstelle eines weiteren Kommentars zu geben.

Wie ich in einem Kommentar sagte, funktioniert eine reine/einfache Select-Anweisung in PL/SQL nicht. Aber ich habe mich geirrt, als ich sagte, dass Sie eine gespeicherte Funktion brauchen, um einen Ref-Cursor zurückzugeben.

Aber der Reihe nach:Der Typ "id_array", den Sie in Ihrem PL/SQL-Block deklarieren, ist ein PL/SQL-Typ. Es kann nicht in einer ref-Cursor-Select-Anweisung verwendet werden. Stattdessen benötigen Sie einen SQL-Typ:

create type id_array as table of number;

Dies muss nur einmal ausgeführt werden, genau wie ein "Tabelle erstellen".

Ihr PL/SQL-Block könnte dann so aussehen:

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:
Beim Zusammenstellen dieses Posts wurde mir klar, woher der ORA-00942 kommen könnte. Das Array t_ids basierte auf einem PL/SQL-Typ, der auf der SQL-Seite nicht bekannt/verfügbar ist.