2014-10-09 3 views
1

Извините за то, что вы получили широкое название на вопрос, но я не нашел способ упростить его дальше.Как закодировать SYS_REFCURSOR с несколькими таблицами?

Я создаю пакет для клиента, этот пакет имеет процедуру, которая возвращает SYS_REFCURSOR. Запрос, который его подает, представляет собой выбор из нескольких таблиц с примерно 20 полями. На второй процедуре мне нужно вызвать это и пропустить результаты для подачи других местоположений.

У меня возникли проблемы с использованием части цикла into. Я не могу использовать table%ROWTYPE. Я попытался объявить OBJECT о процедуре, но это было запрещено. Должен ли я сделать FETCH XXX INTO LIST_OF_INDVIDUAL_VARIABLES?

DECLARE 
    dt_field TABLE1.dt_field%TYPE; 
    p_resultset SYS_REFCURSOR; 
    p_individual OBJECT ( 
    FIELD0   DATE, 
    FIELD1   TABLE.FIELD1%TYPE, 
    FIELD2   TABLE.FIELD2%TYPE, 
    FIELD3   TABLE.FIELD3%TYPE, 
    FIELD4   TABLE.FIELD4%TYPE 
); 

BEGIN 
    PACKAGE.PROCEDURE1(dt_field); 
    dbms_output.put_line(dt_field); 
    PACKAGE.PROCEDURE2(dt_field, p_resultset); 

    LOOP 
    -- this do not work 
    FETCH p_resultset INTO p_individual; 
    EXIT WHEN p_resultset%NOTFOUND; 
    -- DO STUFF ON EACH RETURNED ROW 
    END LOOP; 
    CLOSE p_resultset;  
END; 
+1

_ "Я пытался объявить объект OBJECT, но ** он не был разрешен ** «_ В результате вашей политики предприятия? Из-за отсутствия необходимых разрешений? Или это просто порождает какую-то ошибку? –

+1

Взгляните на этот ответ Alex Poole, возможно: http://stackoverflow.com/a/11233929/2363712 –

+1

Вам нужно объявить тип записи в PL/SQL, а не объект, а затем экземпляр этого тип записи. Показ ошибки, которую вы получите, будет полезен. Я не уверен, что вы можете взять курсор ref в тип записи, вне его. –

ответ

3

Вслед за мой комментарий, вы не можете создать тип объекта в PL/SQL, вы должны объявить тип записи, а затем экземпляр этого типа:

DECLARE 
    type r_individual is record (
    FIELD0   DATE, 
    FIELD1   TABLE1.FIELD1%TYPE, 
    FIELD2   TABLE1.FIELD2%TYPE, 
    FIELD3   TABLE1.FIELD3%TYPE, 
    FIELD4   TABLE1.FIELD4%TYPE 
); 
    p_individual r_individual; 
... 

И вы можете вызвать курсор ref в тип записи. Ошибки вашей версии в объявлении объекта, а не fetch.

Вот более полный пример, основанный на том, что в вашем вопросе; Я не ваши процедур так я создаю фиктивный набор результатов с теми же типами, и использовать фиктивные таблицы для %TYPE объявлений:

create table table1(dt_field date, field1 number, field2 varchar2(1), 
    field3 number, field4 varchar2(1)); 

set serveroutput on 
DECLARE 
    type r_individual is record (
    FIELD0   DATE, 
    FIELD1   TABLE1.FIELD1%TYPE, 
    FIELD2   TABLE1.FIELD2%TYPE, 
    FIELD3   TABLE1.FIELD3%TYPE, 
    FIELD4   TABLE1.FIELD4%TYPE 
); 
    dt_field TABLE1.dt_field%TYPE; 
    p_resultset SYS_REFCURSOR; 
    p_individual r_individual; 

BEGIN 
    -- Don't have this package 
    -- PACKAGE.PROCEDURE1(dt_field); 
    -- dbms_output.put_line(dt_field); 
    -- PACKAGE.PROCEDURE2(dt_field, p_resultset); 

    -- Dummy result set for demo instead 
    OPEN p_resultset FOR q'[select sysdate, 1, 'A', 3, 'C' from dual]' 
    || q'[ union all select sysdate, 2, 'B', 4, 'D' from dual]'; 

    LOOP 
    FETCH p_resultset INTO p_individual; 
    EXIT WHEN p_resultset%NOTFOUND; 
    -- DO STUFF ON EACH RETURNED ROW 
    DBMS_OUTPUT.PUT_LINE(p_individual.field1 
     || ':' || p_individual.field2); 
    END LOOP; 
    CLOSE p_resultset; 
END; 
/

который получает:

anonymous block completed 
1:A 
2:B 
+0

Спасибо, что именно там я потерпел неудачу. Переход от MySQL \ MariaDB - это большое дело. Все еще пытаюсь найти свой путь. –

+0

Появляется: выражение 'P_INDIVIDUAL' в списке INTO имеет неправильный тип – delive

+0

@delive - появляется где? Этот код работает без ошибок в SQL \ * Plus и SQL Developer, снова 11g и 12c. Каково полное сообщение об ошибке ORA или PLS? Или ваш клиент/IDE генерирует это сам? Если у вас есть проблема, это не поможет, вам нужно задать новый вопрос. –

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

  • Нет связанных вопросов^_^