Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como usar um Oracle Ref Cursor do C# ODP.NET como um parâmetro ReturnValue, sem usar uma função ou procedimento armazenado?


Vou tentar uma resposta em vez de outro comentário.

Como eu disse em um comentário, uma instrução select pura/simples não funciona em PL/SQL. Mas eu estava errado ao afirmar que você precisa de uma função armazenada para retornar um cursor ref.

Mas antes de mais nada:O tipo "id_array" que você declara em seu bloco PL/SQL é um tipo PL/SQL. Ele não pode ser usado em uma instrução de seleção de cursor ref. Em vez disso, você precisará de um tipo SQL:
create type id_array as table of number;

Isso precisa ser executado apenas uma vez, assim como uma "criar tabela".

Seu bloco PL/SQL pode ficar assim:
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:
Enquanto montava este post, percebi de onde poderia vir o ORA-00942. A matriz t_ids foi baseada em um tipo PL/SQL, que não é conhecido/disponível no lado SQL.