Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> УДФ функция возвращающая более чем одну строку 
:(
    Опции темы
firelex
  Дата 9.1.2004, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 9.12.2003

Репутация: нет
Всего: нет



Доброго времени суток, all!

Проблема такая:
необходимо в БД Оракл создать функцию.
Как сделать чтобы она возвращала несколько строк, а не
одно значение (как, например, SELECT какой-ньдь)?

Код

create or replace function xyz
       (start in varchar)
return varchar
is temp varchar(30);
begin
select name into temp from values where attr= start;
return temp;
end;
/


Такая функция компилируется без ошибок, но затем на

Код

select *
from ( xyz ('Zaire') )
;


Оракл ругается
Код

SQL> SQL>   2    3  from ( xyz ('Zaire') )
                     *
ERROR in Line 2:
ORA-00907: missing right parenthesis


Если функция написана правильно, то как же тогда
получить то, что она возвращает? bored.gif
PM MAIL   Вверх
AntonSaburov
Дата 12.1.2004, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Для Oracle 8i и Oracle 9i существуют так называемые "табличные функции" (конвейерные функции и функции трансформации) , которые умеют возвращать набор данных, который можно рассматривать, как реляционную таблицу в предложении FROM.

Для их создания надо:
1. В предложении RETURN определить тип возвращаемых функцией данных как коллекцию (вложенную таблицу или VARRAY)

2. Поместить вызовы функции в операторы TABLE и CAST

Как пример (вытащил из книжки smile.gif ):

1. Создадим табличный тип
Код

CREATE TYPE pet_t IS OBJECT (
 NAME VARCHAR2 (60),
 breed VARCHAR2 (100),
 dob DATE);
/

CREATE TYPE pet_nt IS TABLE OF pet_t;


2. Создадим функцию, которая принимает в качестве аргументов два объекта типа pet_t - mon_in (мать) и dad_in (отец) и возвращает таблицу о составе его "семьи"
Код

CREATE OR REPLACE FUNCTION pet_family (dad_in IN pet_t, mom_in IN pet_t)
 RETURN pet_nt
IS
 l_count PLS_INTEGER;
 retval pet_nt := pet_nt();

 PROCEDURE extend_assign (pet_in IN pet_t) IS
 BEGIN
   retval.EXTEND;
   retval (retval.LAST) := pet_in;
 END;

BEGIN
 extend_assign(dad_in);
 extend_assign (mon_in);

 IF mom_in.breed = 'RABBIT' THEN l_count := 12;
 ELSIF mon_in.breed = 'DOF' THEN l_count := 4;
 ELSIF mon_in.breed = 'KANGAROO' THEN l_count := 1;
 END IF;

 FOR indx IN 1 .. l_count
 LOOP
   extend_assign(pet_t ('BABY' || indx, mom_in.breed, SYSDATE));
 END LOOP;

 RETURN retval;
END;


3. Теперь эту функцию можно вызвать так:
Код

SELECT * FROM TABLE ( CAST (
                         pet_family(
                                pet_t('Hoppy', 'RABBIT', SYSDATE),
                                pet_t('Hippy', 'RABBIT', SYSDATE)
                         ) AS pet_nt
                 ));

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1076 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.