sql >> Databáze >  >> RDS >> Oracle

Jak používat referenční kurzor Oracle z C# ODP.NET jako parametr ReturnValue bez použití uložené funkce nebo procedury?

Místo dalšího komentáře se pokusím odpovědět.

Jak jsem řekl v jednom komentáři, čistý/jednoduchý výběrový příkaz nefunguje v PL/SQL. Ale mýlil jsem se, když jsem uvedl, že pro návrat referenčního kurzoru potřebujete uloženou funkci.

Ale nejdřív:Typ "id_array", který deklarujete ve svém PL/SQL-bloku, je typ PL/SQL. Nelze jej použít v příkazu výběru referenčního kurzoru. Místo toho budete potřebovat typ SQL:

create type id_array as table of number;

Toto je třeba provést pouze jednou, stejně jako "vytvořit tabulku".

Váš PL/SQL-blok by pak mohl vypadat takto:

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:
Při sestavování tohoto příspěvku jsem si uvědomil, odkud může pocházet ORA-00942. Pole t_ids bylo založeno na typu PL/SQL, který není znám/není k dispozici na straně SQL.




  1. Úplné obnovení clusteru MySQL nebo MariaDB Galera ze zálohy

  2. Mac + virtualenv + pip + postgresql =Chyba:Spustitelný soubor pg_config nebyl nalezen

  3. Zkontrolujte, zda řetězec obsahuje znaky s diakritikou v SQL?

  4. Jak zkontrolovat verzi MySQL