Ik zal een antwoord proberen in plaats van nog een opmerking.
Zoals ik in een opmerking al zei, werkt een pure/eenvoudige select-statement niet in PL/SQL. Maar ik had het bij het verkeerde eind door te stellen dat je een opgeslagen functie nodig hebt om een ref-cursor terug te geven.
Maar eerst:het type "id_array" dat u declareert in uw PL/SQL-blok is een PL/SQL-type. Het kan niet worden gebruikt in een ref cursor select-statement. In plaats daarvan heeft u een SQL-type nodig:
create type id_array as table of number;
Dit hoeft maar één keer te worden uitgevoerd, net als een "tabel maken".
Je PL/SQL-blok zou er dan zo uit kunnen zien:
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:
Tijdens het samenstellen van dit bericht realiseerde ik me waar de ORA-00942 vandaan zou kunnen komen. De array t_ids was gebaseerd op een PL/SQL-type, dat niet bekend/beschikbaar is aan de SQL-kant.