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

Връщане на колекция от пакетирана функция за използване в select

Можете или да използвате SQL обекти във вашия пакет, или да използвате конвейерни функции (тествани с 10gr2). Използването на SQL обекти е лесно, действителната ви функция може да се използва както е вътре в пакет.

Ето как можете да използвате конвейерна функция с тип RECORD:

SQL> CREATE OR REPLACE PACKAGE my_pkg IS
  2     TYPE t_col IS RECORD(
  3        i NUMBER,
  4        n VARCHAR2(30));
  5     TYPE t_nested_table IS TABLE OF t_col;
  6     FUNCTION return_table RETURN t_nested_table PIPELINED;
  7  END my_pkg;
  8  /

Package created
SQL> CREATE OR REPLACE PACKAGE BODY my_pkg IS
  2     FUNCTION return_table RETURN t_nested_table PIPELINED IS
  3        l_row t_col;
  4     BEGIN
  5        l_row.i := 1;
  6        l_row.n := 'one';
  7        PIPE ROW(l_row);
  8        l_row.i := 2;
  9        l_row.n := 'two';
 10        PIPE ROW(l_row);
 11        RETURN;
 12     END;
 13  END my_pkg;
 14  /

Package body created

SQL> select * from table(my_pkg.return_table);

         I N
---------- ------------------------------
         1 one
         2 two

Това, което се случва зад сцената, е, че Oracle разбира, че тъй като искате да използвате функцията си в заявка (поради ключовата дума PIPELINED), ще ви трябват SQL обекти, така че тези обекти се създават зад сцената за вас:

SQL> select object_name
  2    from user_objects o
  3   where o.created > sysdate - 1
  4     and object_type = 'TYPE';

OBJECT_NAME
--------------------------------------------------------------------------------
SYS_PLSQL_798806_24_1
SYS_PLSQL_798806_DUMMY_1
SYS_PLSQL_798806_9_1

SQL> select text from user_source where name='SYS_PLSQL_798806_9_1';

TEXT
--------------------------------------------------------------------------------
type        SYS_PLSQL_798806_9_1 as object (I NUMBER,
N VARCHAR2(30));


  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. Грешка - SQL грешка:ORA- 00946:липсва TO ключова дума

  2. Връзка с база данни Винаги прекъсвайте връзката, когато разработвате на същия компютър като DB

  3. Магията на DUAL

  4. Множество THEN към един оператор CASE?

  5. Име на SQL колона, същото като име на променлива PL/SQL - Как може да се направи това в оператор select?