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

Как да извлечете множество редове от съхранена функция с Oracle

с типове SQL не можете да направите %ROWTYPE, ще трябва да въведете всяка колона, за да съответства на таблицата*.

*sys.anydataset настрана. но преминаването по този път е много по-сложно кодиране.

напр. ако вашата таблица беше

create table foo (id number, cola varchar2(1));

след това

create type email_queue_type is object (id number, cola varchar2(1));
/
create type t_email_queue_type as table of email_queue_type;
/

и използвайте тази таблица email_queue_type_tab като изход от вашата функция.

но бих препоръчал конвейерна функция, тъй като текущият ви код не е мащабируем.

напр.:

SQL> create table foo (id number, cola varchar2(1));

Table created.

SQL>
SQL> create type email_queue_type is object (id number, cola varchar2(1));
  2  /

Type created.

SQL> create type t_email_queue_type as table of email_queue_type;
  2  /

Type created.

SQL> insert into foo select rownum, 'a' from dual connect by level <= 10;

10 rows created.

SQL>
SQL> create or replace PACKAGE email_queue AS
  2
  3
  4    FUNCTION lock_and_get return t_email_queue_type pipelined;
  5
  6  END email_queue;
  7  /

Package created.

SQL> create or replace PACKAGE BODY email_queue AS
  2
  3      FUNCTION lock_and_get RETURN t_email_queue_type pipelined AS
  4        queue_obj t_email_queue_type;
  5
  6      BEGIN
  7
  8       for r_row in (select * from foo)
  9              loop
 10                pipe row(email_queue_type(r_row.id, r_row.cola));
 11              end loop;
 12
 13      END lock_and_get;
 14
 15  END email_queue;
 16  /

Package body created.

SQL> select * from table(email_queue.lock_and_get());

        ID C
---------- -
         1 a
         2 a
         3 a
         4 a
         5 a
         6 a
         7 a
         8 a
         9 a
        10 a

10 rows selected.

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. Какъв е размерът по подразбиране на въвеждане на varchar2 в съхранената процедура на Oracle и може ли да бъде променен?

  2. Как да задам условна стойност DEFAULT на колона в oracle, без да използвам тригери?

  3. Най-бързото четене на OLEDB от ORACLE

  4. SQL Sub-Query - как да намерите минимална стойност

  5. Oracle/SQL:Защо заявката SELECT * FROM записи WHERE rownum>=5 И rownum <=10 - връща нула редове