Как можно вернуть таблицу из функции Oracle без пользовательского типа или курсора? - PullRequest
3 голосов
/ 04 марта 2009

Я хочу вернуть таблицу результатов из функции Oracle. Использовать курсор было бы проще, но приложение, с которым я должен работать, не примет курсор в качестве возвращаемого значения. Альтернатива - создать тип (вероятно, упакованный в пакет) для использования вместе с этой функцией. Тем не менее, кажется несколько излишним создавать несколько типов (у меня есть 4+ функции для записи), чтобы я мог возвращать результаты таблицы. Есть ли альтернатива, которую мне не хватает?

Ответы [ 2 ]

3 голосов
/ 04 марта 2009

ОБНОВЛЕНИЕ: См. Первый комментарий для решения ТАБЛИЦА без ограничения размера.

Вернуть VARRAY или использовать функцию PIPELINED для запроса от них.

  • Для VARRAY подробности смотрите в этой статье. Пример кода оттуда:

    CREATE OR REPLACE TYPE EMPARRAY is VARRAY(20) OF VARCHAR2(30)
    /
    
    CREATE OR REPLACE FUNCTION getEmpArray RETURN EMPARRAY
    AS
      l_data EmpArray := EmpArray();
      CURSOR c_emp IS SELECT ename FROM EMP;
    BEGIN
      FOR emp_rec IN c_emp LOOP
        l_data.extend;
        l_data(l_data.count) := emp_rec.ename;
      END LOOP;
    RETURN l_data;
    

    END;

  • Для PiPELINED проверка функций здесь . Пример кода:

    create or replace function Lookups_Fn return lookups_tab
      pipelined
    is
      v_row lookup_row;
    begin
      for j in 1..10
      loop
        v_row :=
          case j
            when 1 then lookup_row ( 1, 'one' )
            --...
            when 7 then lookup_row ( 7, 'seven' )
            else        lookup_row ( j, 'other' )
          end;
        pipe row ( v_row );
      end loop;
      return;
    end Lookups_Fn;
    /
    
    select * from table ( Lookups_Fn );
    
1 голос
/ 11 марта 2009

Вы всегда можете вернуть XML из своей функции, если это подходит разработчикам приложений.

XML может быть сгенерирован несколькими способами в Oracle, в зависимости от того, что вы установили и какую версию вы используете.

XMLTYPE очень полезен в определенных контекстах и ​​может быть сгенерирован из SQL с использованием встроенных функций XMLElement, XMLAttributes, XMLAgg и т. Д. Если клиент не поддерживает XMLTYPE, его можно легко привести к значениям CLOB.

Возможно, самый простой, хотя и не самый лучший (IMO) вариант - использовать пакет dbms_xmlgen:

SQL> set serveroutput on size 1000;
SQL> exec dbms_output.put_line( dbms_xmlgen.getXML( 'select * from dual' ) );

Выход:

<?xml version="1.0"?>
<ROWSET>
 <ROW>
  <DUMMY>X</DUMMY>
 </ROW>
</ROWSET>

Это дает вам ваши "таблицы" результатов в одном значении CLOB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...