sql >> Database >  >> RDS >> Oracle

Hoe gebruik je een Oracle Ref Cursor van C# ODP.NET als een ReturnValue-parameter, zonder een opgeslagen functie of procedure te gebruiken?

Ik zal een antwoord proberen in plaats van nog een opmerking.

Zoals ik in een opmerking al zei, werkt een pure/eenvoudige select-statement niet in PL/SQL. Maar ik had het bij het verkeerde eind door te stellen dat je een opgeslagen functie nodig hebt om een ​​ref-cursor terug te geven.

Maar eerst:het type "id_array" dat u declareert in uw PL/SQL-blok is een PL/SQL-type. Het kan niet worden gebruikt in een ref cursor select-statement. In plaats daarvan heeft u een SQL-type nodig:

create type id_array as table of number;

Dit hoeft maar één keer te worden uitgevoerd, net als een "tabel maken".

Je PL/SQL-blok zou er dan zo uit kunnen zien:

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:
Tijdens het samenstellen van dit bericht realiseerde ik me waar de ORA-00942 vandaan zou kunnen komen. De array t_ids was gebaseerd op een PL/SQL-type, dat niet bekend/beschikbaar is aan de SQL-kant.




  1. DATE() Voorbeelden – MySQL

  2. Drie tabellen samenvoegen met MySQL

  3. Hoe de datum en tijd in SQL Server te formatteren?

  4. Wat veroorzaakt Meer wordt niet herkend... fout bij het uitvoeren van Postgresql 11 op een Windows-computer?