2014-01-17 3 views
0

Я использую Toad. У меня есть заявление таблицы в пакете следующим образом:Oracle PL/SQL - Показать результаты объявленной таблицы

TYPE MyRecordType IS RECORD 
    (ID      MyTable.ID%TYPE 
    ,FIELD1     MyTable.FIELD1%TYPE 
    ,FIELD2     MyTable.FIELD2%TYPE 
    ,FIELD3     MyTable.FIELD3%TYPE 
    ,ANOTHERFIELD   VARCHAR2(80) 
    ); 
    TYPE MyTableType IS TABLE OF MyRecordType INDEX BY BINARY_INTEGER; 

Существует процедура (позволяет сказать MyProcedure), который использует объект этого типа таблицы в качестве ввода/вывода. Я хочу запустить процедуру и увидеть результаты (как заполняется таблица). Так что я имею в виду, я буду выбирать результаты из таблицы:

declare 
    IO_table   MyPackage.MyTableType; 
begin      
    MyPackage.MyProcedure (IO_table 
         ,parameter1 
         ,parameter2 
         ,parameter3); 
    select * from IO_table; 
end; 

Я получаю сообщение: Table or view does not exist (для IO_table). Если я удаляю строку выбора, процедура выполняется успешно, но я не вижу ее результатов. Как я могу увидеть содержимое IO_table после вызова процедуры?

ответ

1

Вы не можете видеть результаты для/SQL таблицы PL с помощью Select * from IO_table

вы необходимо будет выполнить цикл в коллекции в анонимном блоке. сделать что-то подобное, данное в псевдокоде ниже ...

 declare 
     IO_table   MyPackage.MyTableType; 
     l_index  BINARY_INTEGER; 
    begin      
     MyPackage.MyProcedure (IO_table 
        ,parameter1 
        ,parameter2 
        ,parameter3); 
     l_index := IO_table.first; 

     While l_index is not null 
     loop 

     dbms_output.put_line (IO_table(l_index).id); 
     . 
     . 
     . 
     . 

     l_index :=IO_table.next(l_index_id); 

    end loop; 
    end;  
+0

Я получаю: неправильное число или типы аргументов при вызове «NEXT», что ставит меня как нечетное. Что это может означать? –

+0

Вы просто поместите индекс снова как параметр для следующего: l_index: = IO_table.next (l_index); Спасибо, все отлично. –

+0

@StefanosKargas: Спасибо, что указали, что вне редактирования кода. – vishad

1

Вы должны сделать это так:

select * from TABLE(IO_table); 
  • и, конечно, вы пропустили INTO или BULK COLLECT INTO пункт
+0

я получаю сообщение: не может получить доступ к строкам из невложенной таблицы. Я нашел это: http://stackoverflow.com/questions/896356/oracle-error-ora-22905-cannot-access-rows-from-a-non-nested-table-item. Если я создаю тип, как было предложено, процедура не распознает новый тип: неправильный номер или типы аргументов при вызове –

+0

Да, вы должны создать тип глобально с помощью 'CREATE TYPE ...' –

+0

Дело в том, что я мне не разрешено изменять декларацию типа в процедуре, а также сама процедура. Мне просто нужно вызвать процедуру и изучить результаты. –

0

1) Вы не можете использовать ассоциативные массивы в ЗЕЬЕСТ, Просто вложенные таблицы или varrays объявлены глобально. 2) Вы должны использовать выражение TABLE() в инструкции SELECT 3) Вы не можете просто использовать SELECT в PL/SQL-коде - необходимо использовать курсор FOR LOOP или REF CURSOR или BULK COLLECT INTO или INTO. 4) Последнее, но не в последнюю очередь - пожалуйста, изучить руководство: http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjcol.htm#ADOBJ00204

Просто пример:

SQL> create type t_obj as object(id int, name varchar2(10)); 
    2/

SQL> create type t_obj_tab as table of t_obj; 
    2/

SQL> var rc refcursor 
SQL> declare 
    2 t_var t_obj_tab := t_obj_tab(); 
    3 begin 
    4 t_var.extend(2); 
    5 t_var(1) := t_obj(1,'A'); 
    6 t_var(2) := t_obj(2,'B'); 
    7 open :rc for select * from table(t_var); 
    8 end; 
    9/

SQL> print rc 

     ID NAME                 
---------- ----------               
     1 A                  
     2 B                  
Смежные вопросы