2013-10-24 5 views
1

Я пытаюсь вернуть таблицу с помощью функции в пакете Oracle:Oracle пакет возвращения таблица

CREATE OR REPLACE PACKAGE test AS 

    TYPE rec IS RECORD(
     col1 VARCHAR(10)); 

    TYPE rec_table IS TABLE OF rec; 

    FUNCTION get_table(input VARCHAR2) 
     RETURN rec_table 
     PIPELINED; 
END; 

CREATE OR REPLACE PACKAGE BODY test AS 

    FUNCTION get_table(input VARCHAR2) 
     RETURN rec_table 
     PIPELINED IS 

    rec1 rec; 

BEGIN 
SELECT * INTO rec1 
FROM 
(
SELECT '1' from dual 
UNION ALL 
SELECT '2' from dual 
); 

PIPE ROW (rec1) 
RETURN; 
END get_table; 
END; 

, но когда я пытаюсь запустить

select * from table(test.get_table('blah')) 

я получаю сообщение об ошибке: точная выборка возвращает более запрошенное количество строк

Я немного читал о BULK COLLECT INTO, но я не понимаю синтаксиса ...

ответ

1

Следующий фрагмент кода:

SELECT '1' from dual 
UNION ALL 
SELECT '2' from dual 

Возвращает два, а не один рекорд, и вы пытаетесь поставить эти две записи в одной rec переменной. Вместо этого вы должны проконсультироваться по результатам UNION:

FOR v_rec IN (
    SELECT * 
    FROM (
     SELECT '1' from dual 
     UNION ALL 
     SELECT '2' from dual 
    ) 
) 
LOOP 
    PIPE ROW (v_rec); 
END LOOP; 
+0

Должен ли я объявлять v_rec как-то? – mrkb80

+0

@ mrkb80 Нет, не следует - это делается автоматически для вас Oracle. –

+0

работает как чемпион! – mrkb80

Смежные вопросы