Цикл в процедуре oracle
Mikhail Aleksandrovich Member [] : : 74 | , select Tax_Payer_Number, First_Name, Last_Name From revenue_office where First_name = ‘Bob’ and Tax_Payer_Number = 123456789; Tax_Payer_Number , tax_payer_numbers. revenue_office Tax_Payer_Number tax_payer_numbers. select Tax_Payer_Number, First_Name, Last_Name From revenue_office where First_name = ‘Bob’ and Tax_Payer_Number in (Tax_Payer_Number from tax_payer_numbers); . Tax_Payer_Number ? |
Serguei Member : Papua New Guinea : 713 |
. . join: select r.Tax_Payer_Number, r.First_Name, r.Last_Name From revenue_office r,tax_payer_numbers t where r.First_name = ‘Bob’ and r.Tax_Payer_Number=r.Tax_Payer_Number ; = PS , select ( select Tax_Payer_Number from tax_payer_numbers) | ||
Serguei Member : Papua New Guinea : 713 | select r.Tax_Payer_Number, r.First_Name, r.Last_Name From revenue_office r,tax_payer_numbers t where r.First_name = ‘Bob’ and r.Tax_Payer_Number=t.Tax_Payer_Number ; |
Guest |
. | ||
suPPLer Member : , : 7794 | Mikhail Aleksandrovich, , , . , . |
Mikhail Aleksandrovich Member [] : : 74 | suPPLer, SELECT max(table3.field2) field2, table2.field1 field1, (avg(table1.field3*Table2.field3)) correlation, avg(table3.field3) field3 FROM maintable table1 LEFT JOIN maintable Table2 ON Table1.field2 = Table2.field2, maintable table4 left join maintable Table3 on table4.field1=table3.field1 and table4.field2 =table3.field2 where table3.field2 = number1 and table2.field1= number2 and table4.field1= table1.field1 and table1.field1 in (select table1.field1 from maintable table1 left JOIN maintable Table2 ON Table1.field4 + 11 > Table2.field4 and Table1.field4 <= Table2.field4 AND Table1.field2 = Table2.field2 and Table1.field1<> Table2.field1 where table1.field2 = number1 and table2.field1= number2 group by table1.field1) group by table1.field1, table2.field1; , table2.field1 1 100000. number2 1 100000 table2.field1 in (1,2,3,4,5,…,100000) ))) |
suPPLer Member : , : 7794 | Mikhail Aleksandrovich, pivot – 1 100000. |
Serguei Member : Papua New Guinea : 713 |
… ))) PL SQL : SQL , . . table: For cur in (select * from table) loop begin — — insert into log_table (rec, Column1) values (sys, cur.column1); commit; end; end loop; sql – , SQL. )) | ||
Serguei Member : Papua New Guinea : 713 |
… , … | ||
bigsov Member : : 282 | src , … SELECT MAX (table3.field2) field2, table2.field1 field1, (AVG (table1.field3 * table2.field3)) correlation, AVG (table3.field3) field3 FROM maintable table1 LEFT JOIN maintable table2 ON table1.field2 = table2.field2 , maintable table4 LEFT JOIN maintable table3 ON table4.field1 = table3.field1 AND table4.field2 = table3.field2 WHERE table3.field2 = number1 AND table2.field1 = number2 AND table4.field1 = table1.field1 AND table1.field1 IN ( SELECT table1.field1 FROM maintable table1 LEFT JOIN maintable table2 ON table1.field4 + 11 > table2.field4 AND table1.field4 <= table2.field4 AND table1.field2 = table2.field2 AND table1.field1 <> table2.field1 WHERE table1.field2 = number1 AND table2.field1 = number2 GROUP BY table1.field1) GROUP BY table1.field1, table2.field1; table2.field1= number2, .. … , – : for n 1 100000 do … table3.field2 … … , : 1. : begin for i in (select Tax_Payer_Number from tax_payer_numbers) loop — i.Tax_Payer_Number— dbms_output.put_line(i.Tax_Payer_Number); end loop; end; 2.
: table2.field1 in (select level l from dual connect by level<=100000) ? | |
Mikhail Aleksandrovich Member [] : : 74 | bigsov, number1 number2 , . number 1 number2 0,2 , . 1000 , number2 ? , table2.field1 in (1,2,3,4,…,1000) sql , , . 1. begin for i in(select field1 from maintable where field2 = number1) loop SELECT MAX (table3.field2) field2, table2.field1 field1, (AVG (table1.field3 * table2.field3)) correlation, AVG (table3.field3) field3 FROM maintable table1 LEFT JOIN maintable table2 ON table1.field2 = table2.field2 , maintable table4 LEFT JOIN maintable table3 ON table4.field1 = table3.field1 AND table4.field2 = table3.field2 WHERE table3.field2 = number1 AND table2.field1 = i.field1 AND table4.field1 = table1.field1 AND table1.field1 IN ( SELECT table1.field1 FROM maintable table1 LEFT JOIN maintable table2 ON table1.field4 + 11 > table2.field4 AND table1.field4 <= table2.field4 AND table1.field2 = table2.field2 AND table1.field1 <> table2.field1 WHERE table1.field2 = number1 AND table2.field1 = i.field1 GROUP BY table1.field1) GROUP BY table1.field1, table2.field1; end loop; end; oracle 2 : Error starting at line 1 in command: begin …. Error report: ORA-06550: line 3, column 1: PLS-00428: an INTO clause is expected in this SELECT ement 06550. 00000 – “line %s, column %s:n%s” *Cause: Usually a PL/SQL compilation error. *Action: 2. table2.field1 in (select level l from dual connect by level<=100000) 100, table2.field1 |
bigsov Member : : 282 |
– PLS-00428: an INTO clause is expected in this SELECT ement select . – ( ). insert select… : PLSQL : Performing SQL Operations from PL/SQL
… , – () . table2.field1, GROUP BY table1.field1, table2.field1? ? … , , … , , … – … | ||||
Mikhail Aleksandrovich Member [] : : 74 | bigsov, : 1. , , , , . : begin FOR i IN 1..100000 LOOP INSERT INTO table_1 — end loop; end; 2. , ( i) . , , , . P.S. ( ) |
AI Member : : 2817 |
200 ” ” 6 ( , !). 0.02, 96 . | ||
bigsov Member : : 282 |
… … 100000 5 (0,2*100/3600)… ? , , , , sql-… | ||
Mikhail Aleksandrovich Member [] : : 74 | bigsov, . begin FOR i IN 1..100000 table2.field1 2, , 4378 67589. , 100000 ? |
bigsov Member : : 282 | , table2.field1, pl/sql: for i in (select distinct field1 from table2) loop |
Serguei Member : Papua New Guinea : 713 | 1) , . , . , . . , 😉 2) , SQL. |
aZm Member : 3 : 2355 | , , , , … |
Источник
На сегодня вы уже многое знаете о PL/SQL. Но очень многое еще впереди. Как и во всех языках программирования, в PL/SQL имеются операторы циклов. Их три основных типа:
- Безусловные циклы (выполняемые бесконечно)
- Интерактивные циклы (FOR)
- Условные циклы (WHILE)
Самый простой тип цикла в языке PL/SQL таков:
LOOP NULL; END LOOP /
Но использовать такой цикл нет смысла, да и для экземпляра БД это не безопасно. Для этого необходимо использовать определенные пути выхода из циклов. Их то же три:
- EXIT – Безусловный выход из цикла. Используется посредством применения оператора IF.
- EXIT WHEN – Выход при выполнении условия.
- GOTO – Выход из цикла во внешний контекст.
Давайте рассмотрим пример с применением цикла LOOP EXIT WHEN. Запишем следующее:
DECLARE i NUMBER := 0; BEGIN LOOP — start loop 1 i := i + 1; IF (i >= 100) THEN i := 0; EXIT; — exit when i >= 0 END IF; END LOOP; — end loop 1 LOOP — start loop 2 i := i + 1; EXIT WHEN (i >= 100); — exit when i >= 0 END LOOP; — end loop 2——– END; /
Получаем после исполнения:
SQL> DECLARE 2 i NUMBER := 0; 3 4 BEGIN 5 6 LOOP 7 i := i + 1; 8 IF (i >= 100) THEN 9 i := 0; 10 EXIT; 11 END IF; 12 END LOOP; 13 14 LOOP 15 i := i + 1; 16 EXIT WHEN (i >= 100); 17 END LOOP; 18 19 END; 20 / Процедура PL/SQL успешно завершена.
Видимых действий не было, но и ошибок то же! Первый цикл закончился после того как i стало равно 10. При этом оно получило значение 0 и произошел выход из цикла. Второй цикл применил вложенное предложение EXIT WHEN, что является более верным его использованием синтаксически. Тем не менее, применение условных операторов предполагает перед выходом из цикла проделать некоторые действия. Цикл LOOP EXIT WHEN END LOOP в последующем будет самым, часто используемым при построении конструкций курсоров. Рассмотрим еще одну разновидность вышеприведенного цикла:
DECLARE k NUMBER := 0; BEGIN WHILE (k < 10) LOOP k := k + 1; END LOOP; END; /
Получаем:
SQL> DECLARE 2 k NUMBER := 0; 3 4 BEGIN 5 6 WHILE (k < 10) LOOP 7 k := k + 1; 8 END LOOP; 9 10 END; 11 / Процедура PL/SQL успешно завершена.
Здесь в отличие от предыдущего цикла, действия выполняются до тех пор пока условие истинно. Если условие ложно, то цикл прекращается. Что хорошо видно из приведенного примера. В PL/SQL в конструкциях циклов нет такого, иногда полезного, оператора как CONTINUE, вследствие того, что выражение CONTINUE зарезервировано языком PL/SQL и используется для других целей. Но такую конструкцию как CONTINUE можно эмулировать, применив цикл вида LOOP EXIT WHEN END LOOP и используя весьма не популярный, но в данном случае очень полезный оператор GOTO!
Запишем следующее, выведем все нечетные числа до 20:
SET SERVEROUTPUT ON DECLARE s NUMBER := 0; BEGIN DBMS_OUTPUT.enable; LOOP IF(MOD(s, 2) = 1) THEN GOTO LESS; END IF; DBMS_OUTPUT.put_line(TO_CHAR(s)||’ is even!’); <<LESS>> EXIT WHEN (s = 20); s := s + 1; END LOOP; END; /
Получаем:
SQL> SET SERVEROUTPUT ON SQL> DECLARE 2 s NUMBER := 0; 3 4 BEGIN 5 6 DBMS_OUTPUT.enable; 7 8 LOOP 9 IF(MOD(s, 2) = 1) THEN 10 GOTO LESS; 11 END IF; 12 DBMS_OUTPUT.put_line(TO_CHAR(s)||’ is even!’); 13 <<LESS>> 14 EXIT WHEN (s = 20); 15 s := s + 1; 16 END LOOP; 17 18 END; 19 / 0 is even! 2 is even! 4 is even! 6 is even! 8 is even! 10 is even! 12 is even! 14 is even! 16 is even! 18 is even! 20 is even! 0 is even! 2 is even! 4 is even! 6 is even! 8 is even! 10 is even! 12 is even! 14 is even! 16 is even! 18 is even! 20 is even! Процедура PL/SQL успешно завершена.
В результате применения GOTO в теле цикла получаем не сложную и понятную логику работы. Теперь давайте рассмотрим, не менее полезный и очень популярный в PL/SQL цикл FOR. Он к стати очень удобен при работе с курсорами, но об этом чуть позднее. Запишем следующее:
BEGIN FOR i IN 1..100 LOOP NULL; END LOOP; END; / SQL> BEGIN 2 FOR i IN 1..100 LOOP 3 NULL; 4 END LOOP; 5 END; 6 / Процедура PL/SQL успешно завершена.
В данный момент FOR успешно ничего не делал аж сто раз! Итак, давайте рассмотрим его чуть ближе, IN как и в операторе SELECT задает диапазон значений итерации цикла, а “..” это как вы помните так называемый “оператор диапазона”! Вот так просто и ясно. Остальное уже знакомо. Замечу так же, что переменная цикла i является переменной только для чтения. По этому шаг цикла FOR изменить принудительно нельзя! Если это необходимо, то лучше применять цикл вида LOOP EXIT WHEN END LOOP! 🙂 Теперь давайте поработаем с числами:
DECLARE s NUMBER := 0; BEGIN DBMS_OUTPUT.enable; FOR i IN 1..20 LOOP IF(MOD(i, 2) = 1) THEN DBMS_OUTPUT.put_line(TO_CHAR(i)||’ is even!’); s := i; END IF; END LOOP; DBMS_OUTPUT.put_line(‘last odd number was ‘||TO_CHAR(s)); END; /
Получаем:
SQL> DECLARE 2 s NUMBER := 0; 3 4 BEGIN 5 DBMS_OUTPUT.enable; 6 FOR i IN 1..20 LOOP 7 IF(MOD(i, 2) = 1) THEN 8 DBMS_OUTPUT.put_line(TO_CHAR(i)||’ is even!’); 9 s := i; 10 END IF; 11 END LOOP; 12 DBMS_OUTPUT.put_line(‘last odd number was ‘||TO_CHAR(s)); 13 END; 14 / 1 is even! 3 is even! 5 is even! 7 is even! 9 is even! 11 is even! 13 is even! 15 is even! 17 is even! 19 is even! last odd number was 19 Процедура PL/SQL успешно завершена.
Та же задачка, только с циклом FOR. Да, функция MOD возвращает остаток от деления чисел, как вы, наверное, уже догадались. Так же в операторе FOR есть возможность задавать обратный отсчет, ну, например, перед стартом или взрывом! 🙂 Вот так:
BEGIN DBMS_OUTPUT.enable; FOR i IN REVERSE 1..10 LOOP DBMS_OUTPUT.put_line(TO_CHAR(i)||’-‘); END LOOP; DBMS_OUTPUT.put_line(‘Blastoff!’); END; /
Получаем:
SQL> BEGIN 2 DBMS_OUTPUT.enable; 3 FOR i IN REVERSE 1..10 LOOP 4 DBMS_OUTPUT.put_line(TO_CHAR(i)||’-‘); 5 END LOOP; 6 DBMS_OUTPUT.put_line(‘Blastoff!’); 7 END; 8 / 10- 9- 8- 7- 6- 5- 4- 3- 2- 1- Blastoff! Процедура PL/SQL успешно завершена.
Нолика не было, но бабахнуло! Вот такой достаточно богатый набор операторов циклов в языке PL/SQL! Надеюсь, вы научитесь с легкостью их применять при построении серверных приложений ваших БД! 🙂
Источник
gg_75 Guest | . procedure(data,client) data – client – char , . ? |
SQLap Member [] : : 34063 | gg_75, select round(last_day(sys) – trunc(sys, ‘MON’) + 1) into d from dual; for c in 1..d loop … end loop; |
Member : from dual : 148 | declare begin for i in reverse 0..ct(day from last_day(sys))-1 loop dbms_output.put_line(to_(last_day(sys)-i)); end loop; end; |
gg_75 Guest | 2009 , for c in 1..31 loop select acc_code+ ‘c’ from fa_accounts get_clients_(to_(‘200901’+c,’YYYYMMDD’),’01’) end loop; ? |
Jannny Member : : 6424 | , … “+” – “||” ? – ? |
gg_75 Guest | select round(last_day(sys) – trunc(sys, ‘MON’) + 1) into d from dual; for c in 1..d loop get_clients_(c,’01’); end loop; |
dmidek Member : – : 119733 |
? , d 🙂 declare d number; | ||
Jannny Member : : 6424 | “!”? : , ? |
SQLap Member [] : : 34063 | ) , , for c in 1..round(last_day(sys) – trunc(sys, ‘MON’) + 1) loop … end loop; |
SQLap Member [] : : 34063 | … |
stax.. Guest | gg_75, declare d ; d_b ; procedure p(dat ,client_id int) is begin dbms_output.put_line(dat||’ ‘||client_id); end; begin d_b:=to_(’01/2009′,’mm/yyyy’); d:=d_b; for i in 1..last_day(d_b)-d_b+1 loop p(d,1); d:=d+1; end loop; end; / ….. stax |
aZm Member : 3 : 2355 | declare v ; begin v:=sys; — . for cc in (select trunc(v,’mm’)+rownum-1 dt from dual connect by rownum<add_months(trunc(v,’mm’),1)-trunc(v,’mm’)+1) loop dbms_output.put_line(to_char(cc.dt,’dd.mm.yyyy’)); end loop; end; : 8 09, 14:39 |
stax.. Guest |
racle9i Enterprise Edition Release 9.2.0.6.0 – Production SQL> declare 2 v ; 3 begin 4 v:=sys; — . 5 for cc in (select trunc(v,’mm’)+rownum-1 dt 6 from dual 7 connect by rownum<add_months(trunc(v,’mm’),1)-trunc(v,’mm’)+1) 8 loop 9 dbms_output.put_line(to_char(cc.dt,’dd.mm.yyyy’)); 10 end loop; 11 end; 12 / 01.05.2009 PL/SQL procedure successfully completed. …… stax : 8 09, 14:40 | ||
aZm Member : 3 : 2355 |
10.2.0.4 😉 9.2.0.8 – . : 8 09, 14:40 | ||||
aZm Member : 3 : 2355 | 🙂 9 sql plsql . plsql 9. open for . : 8 09, 14:38 |
dmidek Member : – : 119733 |
, – , select ….. from ( ) | ||
stax.. Guest |
13- ….. stax | ||||
Member : : 312 | , – , for-? … PROCEDURE for_Each_Day (p__In_Month , p_Client VARCHAR2) IS v_Cur_ := trunc (p_Day_In_Month, ‘mm’); BEGIN WHILE v_Cur_ <= last_Day (p__In_Month) LOOP get_Clients_ (v_Cur_, p_Client); v_Cur_ := v_Cur_ + 1; END LOOP; END; |
aZm Member : 3 : 2355 |
, 11 , 13 🙂 | ||
dmidek Member : – : 119733 |
, , CONNECT BY PRIOR – , … – , | ||||||
stax.. Guest |
v_Cur_ := v_Cur_ + 1; ( -) ….. stax | |
stax.. Guest |
////// stax | ||||
Источник
В этой главе мы обсудим циклы в PL / SQL. Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: первый оператор в функции выполняется первым, затем второй и так далее.
Языки программирования предоставляют различные управляющие структуры, которые допускают более сложные пути выполнения.
Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.
PL / SQL предоставляет следующие типы циклов для обработки требований циклов. Нажмите на следующие ссылки, чтобы проверить их детали.
S.No | Тип и описание петли |
---|---|
1 | PL / SQL Basic LOOP В этой структуре цикла последовательность операторов заключена между операторами LOOP и END LOOP. На каждой итерации выполняется последовательность операторов, а затем управление возобновляется в верхней части цикла. |
2 | PL / SQL WHILE LOOP Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла. |
3 | PL / SQL FOR LOOP Выполнить последовательность операторов несколько раз и сократить код, который управляет переменной цикла. |
4 | Вложенные циклы в PL / SQL Вы можете использовать один или несколько циклов внутри любого другого базового цикла, в то время как или для цикла. |
В этой структуре цикла последовательность операторов заключена между операторами LOOP и END LOOP. На каждой итерации выполняется последовательность операторов, а затем управление возобновляется в верхней части цикла.
Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.
Выполнить последовательность операторов несколько раз и сократить код, который управляет переменной цикла.
Вы можете использовать один или несколько циклов внутри любого другого базового цикла, в то время как или для цикла.
Маркировка цикла PL / SQL
Циклы PL / SQL могут быть помечены. Метка должна быть заключена в двойные угловые скобки (<< и >>) и указываться в начале оператора LOOP. Имя метки также может отображаться в конце оператора LOOP. Вы можете использовать метку в операторе EXIT для выхода из цикла.
Следующая программа иллюстрирует концепцию –
DECLARE i number(1); j number(1); BEGIN << outer_loop >> FOR i IN 1..3 LOOP << inner_loop >> FOR j IN 1..3 LOOP dbms_output.put_line(‘i is: ‘|| i || ‘ and j is: ‘ || j); END loop inner_loop; END loop outer_loop; END; /
Когда приведенный выше код выполняется в командной строке SQL, он дает следующий результат –
i is: 1 and j is: 1 i is: 1 and j is: 2 i is: 1 and j is: 3 i is: 2 and j is: 1 i is: 2 and j is: 2 i is: 2 and j is: 3 i is: 3 and j is: 1 i is: 3 and j is: 2 i is: 3 and j is: 3 PL/SQL procedure successfully completed.
Операторы управления циклом
Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.
PL / SQL поддерживает следующие операторы управления. Маркировка петель также помогает вывести контроль за пределы петли. Нажмите на следующие ссылки, чтобы проверить их детали.
Оператор Exit завершает цикл, и управление передается оператору сразу после END LOOP.
Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.
Передает управление помеченному выражению. Хотя не рекомендуется использовать оператор GOTO в вашей программе.
Источник