2016-04-25 3 views
0

Я пишу функцию, которая должна управлять несколькими строками одновременно и их нужно индексировать. После нескольких часов чтения о Oracle pl/sql я решил, что могу создать коллекцию вложенных таблиц. Поскольку я не мог найти окончательный ответ, и метод проб/ошибок длится долго. Возможен вопрос: ВОПРОС: Какова наилучшая практика для заполнения вложенной таблицы? Oracle PL/SQLКак вставить в вложенную таблицу с помощью курсора plsql

 type partsTable is table of Parts_north_wing%rowtype; 
     pt PartsTable;  
     index number;   
     cursor pCursor is select * from Parts_north_wing; 
begin 
     index := 1; 
     open pCursor; 
     loop 
       fetch pCursor into tempRow; 
       pt(index) := tempRow; 
       index := index + 1; 
       exit when pCursor%notfound; 
     end loop; 
     close pCursor; 
+0

Я считаю, что наиболее эффективным способом является использование предложения BULK COLLECT INTO на вашем курсоре или выбора, например. 'OPEN pCursor; FETCH pCursor BULK COLLECT INTO pt; CLOSE pCursor; '. – AndrewMcCoist

ответ

2

курсор для LOOP почти всегда лучший способ обработки строк в PL/SQL. Это проще, чем метод OPEN/FETCH/CLOSE - нет необходимости объявлять переменные и манипулировать курсорами. Это также быстрее, поскольку он автоматически набирает результаты.

begin 
    for pt in 
    (
     select parts_north_wing.*, rownum row_index 
     from parts_north_wing 
    ) loop 
     --Do something here 
     null; 
    end loop; 
end; 
/
+0

получил. Таким образом, это неявный курсор для оператора цикла. очень удобно. http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/cursor_for_loop_statement.htm#LNPLS1155 –

0

Попробуйте это. Надеюсь, это поможет вам очистить некоторые из ваших концепций.

--Create a dummy object tyep 
CREATE OR REPLACE TYPE av_obj 
IS 
    OBJECT 
    (
    ADD1 VARCHAR2(100), 
    ADD2 VARCHAR2(100)); 
    --Create a nested tale type 

CREATE OR REPLACE TYPE AV_TT 
IS 
    TABLE OF AV_OBJ; 

    --Bulk collect into nested table type 
    DECLARE 
    av_nested_tab AVROY.AV_TT; 
    BEGIN 
    SELECT avroy.av_obj(LEVEL 
     ||'add1',LEVEL 
     ||'add2') BULK COLLECT 
    INTO av_nested_tab 
    FROM DUAL 
     CONNECT BY LEVEL < 10; 
    END; 
Смежные вопросы