Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да използвам Oracle Ref Cursor от C# ODP.NET като параметър на ReturnValue, без да използвам съхранена функция или процедура?

Ще опитам да отговоря вместо друг коментар.

Както казах в един коментар, чист/прост оператор за избор не работи в 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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на имена на услуги на Oracle с SQLAlchemy

  2. Конфигуриране на репликация на хетерогенна база данни – SQL Server към Oracle

  3. Критерии за хибернация за дати

  4. Невалиден SQL идентификатор

  5. Увеличете дисковата група VOTE в ASM за надстройка на GI 12.2