sql >> Databasteknik >  >> RDS >> Oracle

Hur använder man en Oracle Ref Cursor från C# ODP.NET som en ReturnValue-parameter, utan att använda en lagrad funktion eller procedur?

Jag kommer att försöka ett svar istället för en annan kommentar.

Som jag sa i en kommentar, en ren/enkel select-sats fungerar inte i PL/SQL. Men jag hade fel när jag påstod att du behöver en lagrad funktion för att returnera en ref-markör.

Men först saker först:Typen "id_array" du deklarerar i ditt PL/SQL-block är en PL/SQL-typ. Det kan inte användas i en ref cursor select-sats. Istället behöver du en SQL-typ:

create type id_array as table of number;

Detta behöver endast utföras en gång, precis som en "skapa tabell".

Ditt PL/SQL-block kan då se ut så här:

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:
När jag satte ihop det här inlägget insåg jag var ORA-00942 kan komma ifrån. Arrayen t_ids baserades på en PL/SQL-typ, som inte är känd/tillgänglig på SQL-sidan.




  1. Behöver vi ange inte null för primärnyckeln? Oracle/SQL

  2. java.lang.ClassNotFoundException:org.postgresql.Driver, Android

  3. Konverteringen misslyckades när varchar-värdet 'simple' konverterades till datatyp int

  4. Hur hittar jag MySQL my.cnf-platsen