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.