Ще опитам да отговоря вместо друг коментар.
Както казах в един коментар, чист/прост оператор за избор не работи в PL/SQL. Но сгреших като казах, че се нуждаете от съхранена функция, за да върнете референтен курсор.
Но първо:Типът "id_array", който декларирате във вашия PL/SQL-блок, е тип PL/SQL. Не може да се използва в оператор за избор на референтен курсор. Вместо това ще ви трябва SQL тип:
create type id_array as table of number;
Това трябва да се изпълни само веднъж, точно като "създаване на таблица".
Тогава вашият PL/SQL-блок може да изглежда така:
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:
Докато сглобявах тази публикация, разбрах откъде може да дойде ORA-00942. Масивът t_ids е базиран на тип PL/SQL, който не е известен/наличен от страна на SQL.