Oracle PL/SQL/PL SQL/Loop
Содержание
An anonymous block demonstrates a guard on exit simple loop
<source lang="sql">
SQL> SQL> DECLARE
2 counter NUMBER; 3 first BOOLEAN; 4 BEGIN 5 LOOP 6 IF NVL(counter,1) >= 1 THEN 7 IF NOT NVL(first,TRUE) THEN 8 counter := counter + 1; 9 ELSE 10 counter := 1; 11 first := FALSE; 12 END IF; 13 END IF; 14 dbms_output.put_line("Iteration ["||counter||"]"); 15 16 EXIT WHEN NOT counter < 3; 17 END LOOP; 18 END; 19 /
Iteration [1] Iteration [2] Iteration [3] PL/SQL procedure successfully completed. SQL>
</source>
Empty Loop statement
<source lang="sql">
SQL> SQL> BEGIN
2 LOOP 3 NULL; 4 EXIT; 5 END LOOP; 6 END; 7 /
PL/SQL procedure successfully completed. SQL> SQL> --
</source>
Insert a row into MyTable with the current value of the loop counter.
<source lang="sql">
SQL> SQL> SQL> CREATE TABLE MyTable (
2 num_col NUMBER, 3 char_col VARCHAR2(60) 4 );
Table created. SQL> SQL> DECLARE
2 v_Counter BINARY_INTEGER := 1; 3 BEGIN 4 LOOP 5 INSERT INTO MyTable 6 VALUES (v_Counter, "Loop index"); 7 v_Counter := v_Counter + 1; 8 IF v_Counter > 50 THEN 9 EXIT; 10 END IF; 11 END LOOP; 12 END; 13 /
PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table MyTable; Table dropped. SQL> SQL>
</source>
LOOP..END LOOP, Cursor Loop
<source lang="sql">
SQL> SQL> CREATE TABLE lecturer (
2 id NUMBER(5) PRIMARY KEY, 3 first_name VARCHAR2(20), 4 last_name VARCHAR2(20), 5 major VARCHAR2(30), 6 current_credits NUMBER(3) 7 );
Table created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10001, "Scott", "Lawson","Computer Science", 11);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major, current_credits)
2 VALUES (10002, "Mar", "Wells","History", 4);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10003, "Jone", "Bliss","Computer Science", 8);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10004, "Man", "Kyte","Economics", 8);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10005, "Pat", "Poll","History", 4);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10006, "Tim", "Viper","History", 4);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10007, "Barbara", "Blues","Economics", 7);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10008, "David", "Large","Music", 4);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10009, "Chris", "Elegant","Nutrition", 8);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10010, "Rose", "Bond","Music", 7);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10011, "Rita", "Johnson","Nutrition", 8);
1 row created. SQL> SQL> INSERT INTO lecturer (id, first_name, last_name, major,current_credits)
2 VALUES (10012, "Sharon", "Clear","Computer Science", 3);
1 row created. SQL> SQL> CREATE TABLE myStudent (
2 student_id NUMBER(5) NOT NULL, 3 department CHAR(3) NOT NULL, 4 course NUMBER(3) NOT NULL, 5 grade CHAR(1) 6 );
Table created. SQL> SQL> SQL> SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10000, "CS", 102, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10002, "CS", 102, "B");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10003, "CS", 102, "C");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10000, "HIS", 101, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10001, "HIS", 101, "B");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10002, "HIS", 101, "B");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10003, "HIS", 101, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10004, "HIS", 101, "C");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10005, "HIS", 101, "C");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10006, "HIS", 101, "E");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10007, "HIS", 101, "B");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10008, "HIS", 101, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10009, "HIS", 101, "D");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10010, "HIS", 101, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10008, "NUT", 307, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10010, "NUT", 307, "A");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10009, "MUS", 410, "B");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10006, "MUS", 410, "E");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10011, "MUS", 410, "B");
1 row created. SQL> SQL> INSERT INTO myStudent (student_id, department, course, grade)
2 VALUES (10000, "MUS", 410, "B");
1 row created. SQL> SQL> SQL> CREATE TABLE MyTable (
2 num_col NUMBER, 3 char_col VARCHAR2(60) 4 );
Table created. SQL> SQL> DECLARE
2 myLecturerID lecturer.id%TYPE; 3 myFirstName lecturer.first_name%TYPE; 4 v_LastName lecturer.last_name%TYPE; 5 6 CURSOR myHistoryLecturer IS 7 SELECT id, first_name, last_name 8 FROM lecturer 9 WHERE major = "History"; 10 BEGIN 11 OPEN myHistoryLecturer; 12 LOOP 13 FETCH myHistoryLecturer INTO myLecturerID, myFirstName, v_LastName; 14 15 EXIT WHEN myHistoryLecturer%NOTFOUND; 16 17 INSERT INTO myStudent (student_id, department, course) 18 VALUES (myLecturerID, "HIS", 301); 19 20 INSERT INTO MyTable (num_col, char_col) 21 VALUES (myLecturerID, myFirstName || " " || v_LastName); 22 23 END LOOP; 24 25 CLOSE myHistoryLecturer; 26 27 COMMIT; 28 END; 29 /
PL/SQL procedure successfully completed. SQL> SQL> select * from MyTable;
NUM_COL CHAR_COL
------------------------------------------------------------
10002 Mar Wells 10005 Pat Poll 10006 Tim Viper
SQL> SQL> drop table MyTable; Table dropped. SQL> SQL> drop table lecturer; Table dropped. SQL> drop table myStudent; Table dropped. SQL> SQL>
</source>
Loop with label
<source lang="sql">
SQL> SQL> SQL> DECLARE
2 lv_counter_num PLS_INTEGER := 0; 3 BEGIN 4 <<LOOP1>> 5 LOOP 6 <<LOOP2>> 7 LOOP 8 lv_counter_num := lv_counter_num + 1; 9 DBMS_OUTPUT.PUT_LINE("Counter: " ||lv_counter_num); 10 EXIT LOOP1 WHEN lv_counter_num = 3; 11 END LOOP LOOP2; 12 DBMS_OUTPUT.PUT_LINE("Exited LOOP2"); 13 END LOOP LOOP1; 14 DBMS_OUTPUT.PUT_LINE("Exited LOOP1"); 15 END; 16 /
Counter: 1 Counter: 2 Counter: 3 Exited LOOP1 PL/SQL procedure successfully completed. SQL>
</source>
unconstrained loop
<source lang="sql">
SQL> SQL> declare
2 l_loops number := 0; 3 begin 4 dbms_output.put_line("Before my loop"); 5 6 loop 7 if l_loops > 4 then 8 exit; 9 end if; 10 dbms_output.put_line("Looped " || l_loops || " times"); 11 l_loops := l_loops + 1; 12 end loop; 13 14 dbms_output.put_line("After my loop"); 15 end; 16 /
Before my loop Looped 0 times Looped 1 times Looped 2 times Looped 3 times Looped 4 times After my loop PL/SQL procedure successfully completed. SQL>
</source>
Use EXIT WHEN to exit a loop
<source lang="sql">
SQL> SQL> DECLARE
2 v_Radius NUMBER := 2; 3 BEGIN 4 LOOP 5 DBMS_OUTPUT.PUT_LINE("The AREA of the circle is " 6 || v_RADIUS*v_RADIUS); 7 v_Radius := v_Radius + 2; 8 EXIT WHEN v_Radius > 10; 9 END LOOP; 10 END; 11 /
The AREA of the circle is 4 The AREA of the circle is 16 The AREA of the circle is 36 The AREA of the circle is 64 The AREA of the circle is 100 PL/SQL procedure successfully completed. SQL> --
</source>