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.