Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak używać kursora referencji Oracle z języka C# ODP.NET jako parametru ReturnValue bez użycia funkcji lub procedury przechowywanej?

Spróbuję odpowiedzi zamiast kolejnego komentarza.

Jak powiedziałem w jednym z komentarzy, czysta/prosta instrukcja select nie działa w PL/SQL. Ale pomyliłem się, stwierdzając, że potrzebujesz funkcji przechowywanej, aby zwrócić kursor referencyjny.

Ale po pierwsze:typ „id_array”, który deklarujesz w swoim bloku PL/SQL, jest typem PL/SQL. Nie można jej użyć w instrukcji ref cursor select. Zamiast tego potrzebujesz typu SQL:

create type id_array as table of number;

To musi być wykonane tylko raz, tak jak "utwórz tabelę".

Twój blok PL/SQL mógłby wtedy wyglądać tak:

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:
Podczas montażu tego posta zdałem sobie sprawę, skąd może pochodzić ORA-00942. Tablica t_ids została oparta na typie PL/SQL, który nie jest znany/dostępny po stronie SQL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rozpoczęcie blogowania dla HTML5 i CSS3

  2. Najpopularniejsze przydatne zapytania AWR dotyczące aktualizacji R12.2/R12.1

  3. Formularze Oracle w R12/R12.2

  4. ORA-24247:odmowa dostępu do sieci przez listę kontroli dostępu (ACL)

  5. Jak utworzyć zagnieżdżoną tabelę jako obiekt bazy danych w Oracle?