Oracle итерации и коллекции - PullRequest
0 голосов
/ 14 февраля 2019

Как я могу перебрать цикл и собрать информацию внутри переменной / коллекции?

Что-то вроде:

cursor cursor_c= select col1 from table1 where condition;
collection l;
foreach row in cursor_c
  l.add (select col2 from table2 where col1=row);
end;
printout(l);

Я хочу запустить это как скрипт, а не внутри процедуры.У меня 0 опыта работы с PL / SQL, поэтому любая помощь будет оценена по достоинству!

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Если вы просто хотите, чтобы столбец в таблице соответствовал столбцу из другой таблицы, вам не понадобится цикл, просто используйте JOINS

SELECT t2.col2
  FROM table1 t1
JOIN table2 t2 ON t2.col1 = t1.col1
WHERE '<your_where_conditon>'

Если вы хотите отобразить их с помощью dbms_output, вы можете просто использовать неявный цикл курсора (ответ @Bob Jarvis) или BULK COLLECT для загрузки в коллекцию.

DECLARE
TYPE col2type is TABLE OF table2.col2%TYPE;
col2_t col2type;
BEGIN
SELECT t2.col2 BULK COLLECT INTO col2_t
      FROM table1 t1
    INNER JOIN table2 t2 ON t2.col1 = t1.col1
    WHERE '<your_where_conditon>';
for i in 1..col2_t.count 
loop
  dbms_output.put_line(col2_t(i).col2);
end loop;
END;
/
0 голосов
/ 14 февраля 2019

Фрагмент кода ниже решит вашу проблему.

            set serveroutput on;
    declare
    type ty_tb_name is table of varchar2(20) index by pls_integer;
    l_tb_name ty_tb_name;
    cursor cur_acc_name is
    select account_name from cust_account;
    idx number := 1;
    begin
    for rec in cur_acc_name loop        
        l_tb_name(idx) := rec.account_name;
        idx := idx+1;
        exit when cur_acc_name%notfound;
    end loop;
    DBMS_OUTPUT.put_line('count:'||l_tb_name.count);
    for i in l_tb_name.first..l_tb_name.count loop
        DBMS_OUTPUT.put_line('name:'||l_tb_name(i));
    end loop;

    exception
    when others then
        DBMS_OUTPUT.put_line(SQLERRM);
    end;
    /
0 голосов
/ 14 февраля 2019

Вы можете дублировать показанную логику, но, за исключением необычных обстоятельств, я бы не рекомендовал делать это таким образом.Коллекции доступны и полезны в PL / SQL, но их распечатка выполняется циклически по коллекции - поэтому, если все, что вы делаете, это собирает что-то в памяти, чтобы распечатать его, лучшим выбором будет просто напечатать элементыисходя из курсора, когда курсор повторяется.Кроме того, выполнение одноэлементного SELECT внутри цикла, где данные, выбираемые во внутреннем SELECT, зависят от внешнего SELECT, эквивалентно выполнению JOIN - поэтому объединение вместо проверки связи с базой данных из одной строкиВЫБИРАЕТ.Собирая это вместе, я предлагаю сделать что-то вроде:

BEGIN
  FOR aRow in (SELECT t2.COL2
                 FROM TABLE1 t1
                 INNER JOIN TABLE2 t2
                   ON t2.COL1 = t1.COL1
                 WHERE t1.WHATEVER = vSOMETHING_ELSE)
  LOOP
    DBMS_OUTPUT.PUT_LINE(aRow.COL2);
  END LOOP;
END;

В PL / SQL, как правило, лучше всего использовать курсор для получения данных в нужной форме, а не собирать данные и затем выполнять итерацииколлекция, чтобы преобразовать это.Ваши данные хранятся в базе данных - научитесь там работать с ними.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...