Oracle PL/SQL/Cursor/Cursor Fetch

Материал из SQL эксперт
Перейти к: навигация, поиск

A WHILE cursor fetch loop.

   <source lang="sql">
 

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> 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> CREATE TABLE MyTable (

 2    num_col    NUMBER,
 3    char_col   VARCHAR2(60)
 4    );

Table created. SQL> SQL> SQL> DECLARE

 2    CURSOR MyHistoryLecturer IS
 3      SELECT id, first_name, last_name
 4        FROM lecturer
 5        WHERE major = "History";
 6
 7    myLecturer  MyHistoryLecturer%ROWTYPE;
 8  BEGIN
 9    OPEN MyHistoryLecturer;
10
11    FETCH MyHistoryLecturer INTO myLecturer;
12
13    WHILE MyHistoryLecturer%FOUND LOOP
14      INSERT INTO myStudent (student_id, department, course)
15        VALUES (myLecturer.ID, "HIS", 301);
16
17      INSERT INTO MyTable (num_col, char_col)
18        VALUES (myLecturer.ID,
19                myLecturer.first_name || " " || myLecturer.last_name);
20
21      FETCH MyHistoryLecturer INTO myLecturer;
22    END LOOP;
23
24    CLOSE MyHistoryLecturer;
25  END;
26  /

PL/SQL procedure successfully completed. SQL> SQL> select * from lecturer;

     ID FIRST_NAME           LAST_NAME            MAJOR                          CURRENT_CREDITS

-------------------- -------------------- ------------------------------ ---------------
                1. Scott Lawson Computer Science 11.00
                2. Mar Wells History 4.00
                3. Jone Bliss Computer Science 8.00
                4. Man Kyte Economics 8.00
                5. Pat Poll History 4.00
                6. Tim Viper History 4.00
                7. Barbara Blues Economics 7.00
                8. David Large Music 4.00
                9. Chris Elegant Nutrition 8.00
                10. Rose Bond Music 7.00
                11. Rita Johnson Nutrition 8.00
     ID FIRST_NAME           LAST_NAME            MAJOR                          CURRENT_CREDITS

-------------------- -------------------- ------------------------------ ---------------
                1. Sharon Clear Computer Science 3.00

12 rows selected. SQL> SQL> drop table lecturer; Table dropped. SQL> SQL> drop table MyTable; Table dropped. SQL> SQL> drop table myStudent; Table dropped. SQL>

 </source>
   
  


Below is a function that demonstrates how to use the FETCH statement

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID Employee"s Fi LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


------------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 $1,234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 $6,661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 $6,544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 $2,344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 $2,334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 $4,322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 $7,897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 $1,232.78 Vancouver Tester 8 rows selected. SQL> SQL> SQL> -- Cursor without parameters (simplest) SQL> CREATE OR REPLACE Function FindEmployeeSalary ( name_in IN varchar2 ) RETURN number

 2      IS
 3          mySalary number;
 4
 5          CURSOR c1
 6          IS
 7             SELECT salary
 8              from employee
 9              where first_name = name_in;
10
11      BEGIN
12
13          open c1;
14          fetch c1 into mySalary;
15
16          if c1%notfound then
17               mySalary := 0;
18          end if;
19
20          close c1;
21
22      RETURN mySalary;
23
24      END;
25      /

Function created. SQL> SQL> select FindEmployeeSalary(first_name) from employee; FINDEMPLOYEESALARY(FIRST_NAME)


                      1234.56
                      6661.78
                      6544.78
                      2344.78
                      2334.78
                      4322.78
                      7897.78
                      6544.78

8 rows selected. SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL>


 </source>
   
  


Check Cursor%FOUND after fetching

   <source lang="sql">
 

SQL> CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL,

 2                    ENAME VARCHAR2(10),
 3                    JOB VARCHAR2(9),
 4                    MGR NUMBER(4),
 5                    HIREDATE DATE,
 6                    SAL NUMBER(7, 2),
 7                    COMM NUMBER(7, 2),
 8                    DEPTNO NUMBER(2));

Table created. SQL> SQL> INSERT INTO EMP VALUES (7369, "SMITH", "CLERK", 7902, TO_DATE("17-DEC-1980", "DD-MON-YYYY"), 800, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7499, "ALLEN", "SALESMAN", 7698, TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7521, "WARD", "SALESMAN", 7698, TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7566, "JONES", "MANAGER", 7839, TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7654, "MARTIN", "SALESMAN", 7698,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7698, "BLAKE", "MANAGER", 7839,TO_DATE("1-MAY-1981", "DD-MON-YYYY"), 2850, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7782, "CLARK", "MANAGER", 7839,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES (7788, "SCOTT", "ANALYST", 7566,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7839, "KING", "PRESIDENT", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES (7844, "TURNER", "SALESMAN", 7698,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7876, "ADAMS", "CLERK", 7788,TO_DATE("12-JAN-1983", "DD-MON-YYYY"), 1100, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7900, "JAMES", "CLERK", 7698,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 950, NULL, 30); 1 row created. SQL> INSERT INTO EMP VALUES (7902, "FORD", "ANALYST", 7566,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES (7934, "MILLER", "CLERK", 7782,TO_DATE("23-JAN-1982", "DD-MON-YYYY"), 1300, NULL, 10); 1 row created. SQL> SQL> DECLARE

 2     CURSOR cur_employee_salary IS
 3        SELECT sal
 4        FROM   emp
 5        WHERE  empno = 7369;
 6     lv_cur_employee_salary cur_employee_salary%ROWTYPE;
 7  BEGIN
 8     OPEN cur_employee_salary;
 9     FETCH cur_employee_salary INTO lv_cur_employee_salary;
10     IF cur_employee_salary%FOUND THEN
11        DBMS_OUTPUT.PUT_LINE("Record Found.");
12     ELSE
13        DBMS_OUTPUT.PUT_LINE("Record NOT Found.");
14     END IF;
15     CLOSE cur_employee_salary;
16  END;
17  /

Record Found. PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table emp; Table dropped. SQL> SQL> SQL>

 </source>
   
  


Different BULK_COLLECT statements used for bulk binds

   <source lang="sql">
 

SQL> SQL> set serveroutput on format wrapped SQL> SQL> CREATE TABLE MyTable (

 2    num_col    NUMBER,
 3    char_col   VARCHAR2(60)
 4    );

Table created. SQL> SQL> SQL> DECLARE

 2    TYPE t_Numbers IS TABLE OF MyTable.num_col%TYPE;
 3    TYPE t_Strings IS TABLE OF MyTable.char_col%TYPE;
 4    v_Numbers t_Numbers := t_Numbers(1);
 5    v_Strings t_Strings := t_Strings(1);
 6    v_Numbers2 t_Numbers;
 7    v_Strings2 t_Strings;
 8
 9    CURSOR c_char IS
10      SELECT char_col
11      FROM MyTable
12      WHERE num_col > 800
13      ORDER BY num_col;
14
15  BEGIN
16    v_Numbers.EXTEND(1500);
17    v_Strings.EXTEND(1500);
18    FOR v_Count IN 1..1000 LOOP
19      v_Numbers(v_Count) := v_Count;
20      v_Strings(v_Count) := "Element #" || v_Count;
21      IF v_Count > 500 THEN
22        v_Numbers(v_Count + 500) := v_Count;
23        v_Strings(v_Count + 500) := "Element #" || v_Count;
24      END IF;
25    END LOOP;
26
27    DELETE FROM MyTable;
28    FORALL v_Count IN 1..1500
29      INSERT INTO MyTable (num_col, char_col)
30        VALUES (v_Numbers(v_Count), v_Strings(v_Count));
31
32    SELECT num_col, char_col
33      BULK COLLECT INTO v_Numbers, v_Strings
34      FROM MyTable
35      ORDER BY num_col;
36
37    DBMS_OUTPUT.PUT_LINE(
38      "First query fetched " || v_Numbers.COUNT || " rows");
39
40    SELECT num_col
41      BULK COLLECT INTO v_Numbers2
42      FROM MyTable;
43
44    DBMS_OUTPUT.PUT_LINE(
45      "Second query fetched " || v_Numbers2.COUNT || " rows");
46
47    OPEN c_char;
48    FETCH c_char BULK COLLECT INTO v_Strings2;
49    CLOSE c_char;
50
51    DBMS_OUTPUT.PUT_LINE(
52      "Cursor fetch retrieved " || v_Strings2.COUNT || " rows");
53
54  END;
55  /

First query fetched 1500 rows Second query fetched 1500 rows Cursor fetch retrieved 400 rows PL/SQL procedure successfully completed. SQL> SQL> DECLARE

 2    TYPE t_Numbers IS TABLE OF MyTable.num_col%TYPE
 3      INDEX BY BINARY_INTEGER;
 4    TYPE t_Strings IS TABLE OF MyTable.char_col%TYPE
 5      INDEX BY BINARY_INTEGER;
 6    v_Numbers t_Numbers;
 7    v_Strings t_Strings;
 8  BEGIN
 9    DELETE FROM MyTable;
10    FOR v_Outer IN 1..10 LOOP
11      FOR v_Inner IN 1..v_Outer LOOP
12        INSERT INTO MyTable (num_col, char_col)
13          VALUES (v_Outer, "Element #" || v_Inner);
14      END LOOP;
15      v_Numbers(v_Outer) := v_Outer;
16    END LOOP;
17
18    FORALL v_Count IN 1..5
19      DELETE FROM MyTable
20        WHERE num_col = v_Numbers(v_Count)
21        RETURNING char_col BULK COLLECT INTO v_Strings;
22
23    DBMS_OUTPUT.PUT_LINE("After delete:");
24    FOR v_Count IN 1..v_Strings.COUNT LOOP
25      DBMS_OUTPUT.PUT_LINE(
26        "  v_Strings(" || v_Count || ") = " || v_Strings(v_Count));
27    END LOOP;
28  END;
29  /

After delete:

 v_Strings(1) = Element #1
 v_Strings(2) = Element #1
 v_Strings(3) = Element #2
 v_Strings(4) = Element #1
 v_Strings(5) = Element #2
 v_Strings(6) = Element #3
 v_Strings(7) = Element #1
 v_Strings(8) = Element #2
 v_Strings(9) = Element #3
 v_Strings(10) = Element #4
 v_Strings(11) = Element #1
 v_Strings(12) = Element #2
 v_Strings(13) = Element #3
 v_Strings(14) = Element #4
 v_Strings(15) = Element #5

PL/SQL procedure successfully completed. SQL> SQL> select * from MyTable;

  NUM_COL CHAR_COL

------------------------------------------------------------
        6 Element #1
        6 Element #2
        6 Element #3
        6 Element #4
        6 Element #5
        6 Element #6
        7 Element #1
        7 Element #2
        7 Element #3
        7 Element #4
        7 Element #5
  NUM_COL CHAR_COL

------------------------------------------------------------
        7 Element #6
        7 Element #7
        8 Element #1
        8 Element #2
        8 Element #3
        8 Element #4
        8 Element #5
        8 Element #6
        8 Element #7
        8 Element #8
        9 Element #1
  NUM_COL CHAR_COL

------------------------------------------------------------
        9 Element #2
        9 Element #3
        9 Element #4
        9 Element #5
        9 Element #6
        9 Element #7
        9 Element #8
        9 Element #9
       10 Element #1
       10 Element #2
       10 Element #3
  NUM_COL CHAR_COL

------------------------------------------------------------
       10 Element #4
       10 Element #5
       10 Element #6
       10 Element #7
       10 Element #8
       10 Element #9
       10 Element #10

40 rows selected. SQL> SQL> drop table MyTable; Table dropped. SQL>

 </source>
   
  


FETCH cursor BULK COLLECT

   <source lang="sql">
 

SQL> SQL> CREATE TABLE MyTable (

 2    num_col    NUMBER,
 3    char_col   VARCHAR2(60));

Table created. SQL> SQL> set serveroutput on format wrapped SQL> SQL> DECLARE

 2    TYPE t_Numbers IS TABLE OF MyTable.num_col%TYPE;
 3    TYPE t_Strings IS TABLE OF MyTable.char_col%TYPE;
 4    v_Numbers t_Numbers := t_Numbers(1);
 5    v_Strings t_Strings := t_Strings(1);
 6    v_Numbers2 t_Numbers;
 7    v_Strings2 t_Strings;
 8
 9    CURSOR c_char IS
10      SELECT char_col
11      FROM MyTable
12      WHERE num_col > 800
13      ORDER BY num_col;
14
15  BEGIN
16    v_Numbers.EXTEND(1500);
17    v_Strings.EXTEND(1500);
18    FOR v_Count IN 1..1000 LOOP
19      v_Numbers(v_Count) := v_Count;
20      v_Strings(v_Count) := "Element #" || v_Count;
21      IF v_Count > 500 THEN
22        v_Numbers(v_Count + 500) := v_Count;
23        v_Strings(v_Count + 500) := "Element #" || v_Count;
24      END IF;
25    END LOOP;
26
27    DELETE FROM MyTable;
28    FORALL v_Count IN 1..1500
29      INSERT INTO MyTable (num_col, char_col)
30        VALUES (v_Numbers(v_Count), v_Strings(v_Count));
31
32    SELECT num_col, char_col
33      BULK COLLECT INTO v_Numbers, v_Strings
34      FROM MyTable
35      ORDER BY num_col;
36
37    DBMS_OUTPUT.PUT_LINE("First query fetched " || v_Numbers.COUNT || " rows");
38
39    SELECT num_col
40      BULK COLLECT INTO v_Numbers2
41      FROM MyTable;
42
43    DBMS_OUTPUT.PUT_LINE("Second query fetched " || v_Numbers2.COUNT || " rows");
44
45    OPEN c_char;
46    FETCH c_char BULK COLLECT INTO v_Strings2;
47    CLOSE c_char;
48
49    DBMS_OUTPUT.PUT_LINE("Cursor fetch retrieved " || v_Strings2.COUNT || " rows");
50
51  END;
52  /

First query fetched 1500 rows Second query fetched 1500 rows Cursor fetch retrieved 400 rows PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table MyTable; Table dropped. SQL> SQL>

 </source>
   
  


Fetch cursor data to number variable

   <source lang="sql">

SQL> create table myTable ( x primary key ) organization index as select 1 from dual; Table created. SQL> SQL> create or replace procedure explicit2 is

 2   cursor explicit_cur is select 1 from myTable;
 3   dummy number;
 4   begin
 5   open explicit_cur;
 6   for i in 1 .. 50000 loop
 7       fetch explicit_cur     into dummy;
 8   end loop;
 9   close explicit_cur;
10   end;
11  /

Procedure created. SQL> SQL> drop table myTable; Table dropped.

 </source>
   
  


Fetch cursor till cursorVariable%notfound

   <source lang="sql">

SQL> CREATE TABLE emp(

 2      emp_ID NUMBER (6),
 3      START_DATE  DATE,
 4      END_DATE    DATE,
 5      JOB_ID  VARCHAR2 (10),
 6      DEPARTMENT_ID   NUMBER (4)
 7  );

Table created. SQL> CREATE OR REPLACE PROCEDURE promotion_review_1

 2  IS
 3     nempid   NUMBER;
 4     dstartdate    DATE;
 5     denddate      DATE;
 6     sjobid        VARCHAR2 (20);
 7     CURSOR empCursor IS SELECT emp_id, start_date, end_date, job_id FROM emp;
 8  BEGIN
 9     OPEN empCursor;
10     LOOP
11        FETCH empCursor INTO nempid, dstartdate, denddate, sjobid;
12        EXIT WHEN empCursor%NOTFOUND;
13        DBMS_OUTPUT.put_line ("emp "||nempid||" had job "||sjobid||" for "||(denddate - dstartdate)||" days.");
14     END LOOP;
15     CLOSE empCursor;
16  END;
17  /

Procedure created. SQL> show errors No errors. SQL> drop table emp; Table dropped.

 </source>
   
  


Fetch cursor to table collection of row type

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table emp(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    fname         VARCHAR2(10 BYTE),
 4    lname          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into emp(ID, fname, lname, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from emp

 2  /

ID FNAME LNAME START_DAT END_DATE SALARY CITY


---------- ---------- --------- --------- ---------- ----------

DESCRIPTION


01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester

ID FNAME LNAME START_DAT END_DATE SALARY CITY


---------- ---------- --------- --------- ---------- ----------

DESCRIPTION


04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester

ID FNAME LNAME START_DAT END_DATE SALARY CITY


---------- ---------- --------- --------- ---------- ----------

DESCRIPTION


07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester

8 rows selected. SQL> SQL> SQL> SQL> SQL> DECLARE

 2     TYPE emp_table_struct IS TABLE OF emp.fname%TYPE INDEX BY BINARY_INTEGER;
 3     emp_table emp_table_struct;
 4     CURSOR emp_cursor IS SELECT fname FROM emp ORDER BY id;
 5     v_row      NUMBER := 1;
 6  BEGIN
 7     OPEN emp_cursor;
 8     LOOP
 9          FETCH emp_cursor INTO emp_table(v_row);
10          EXIT WHEN emp_cursor%NOTFOUND;
11          DBMS_OUTPUT.PUT_LINE(emp_table(v_row));
12          v_row := v_row + 1;
13     END LOOP;
14     CLOSE emp_cursor;
15     DBMS_OUTPUT.PUT_LINE("Total rows: "||emp_table.COUNT);
16  END;
17  /

PL/SQL procedure successfully completed. SQL> SQL> -- clean the table SQL> drop table emp

 2  /

Table dropped.

 </source>
   
  


Fetch cursor to two variables

   <source lang="sql">
 

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> SQL> DECLARE

 2    firstName VARCHAR2(20);
 3    v_LastName  VARCHAR2(20);
 4    CURSOR c_lecturer IS
 5      SELECT first_name, last_name FROM lecturer;
 6  BEGIN
 7    OPEN c_lecturer;
 8    LOOP
 9      FETCH c_lecturer INTO firstName, v_LastName;
10      EXIT WHEN c_lecturer%NOTFOUND;
11    END LOOP;
12    CLOSE c_lecturer;
13  END;
14  /

PL/SQL procedure successfully completed. SQL> SQL> drop table lecturer; Table dropped. SQL> SQL>

 </source>
   
  


Fetch cursor value to three variables

   <source lang="sql">

SQL> CREATE TABLE gifts (

 2    gift_id             INTEGER          CONSTRAINT gifts_pk PRIMARY KEY,
 3    gift_type_id        INTEGER          ,
 4    name                   VARCHAR2(30)     NOT NULL,
 5    description            VARCHAR2(50),
 6    price                  NUMBER(5, 2)
 7  );

Table created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (1, 1, "Flower", "Birthday", 19.95); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (2, 1, "Computer", "New Year", 30.00); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (3, 2, "iPod", "Birthday", 25.99); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (4, 2, "iPhone", "New Year", 13.95); 1 row created. SQL> INSERT INTO gifts (gift_id, gift_type_id, name, description, price) VALUES (5, 2, "Book", "Birthday", 49.99); 1 row created. SQL> SQL> SQL> SET SERVEROUTPUT ON SQL> SQL> DECLARE

 2    v_gift_id gifts.gift_id%TYPE;
 3    v_name       gifts.name%TYPE;
 4    v_price      gifts.price%TYPE;
 5
 6    CURSOR giftCursor IS SELECT gift_id, name, price FROM gifts ORDER BY gift_id;
 7
 8  BEGIN
 9    OPEN giftCursor;
10
11    LOOP
12      FETCH giftCursor INTO v_gift_id, v_name, v_price;
13
14      EXIT WHEN giftCursor%NOTFOUND;
15
16      DBMS_OUTPUT.PUT_LINE("v_gift_id = " || v_gift_id || ", v_name = " || v_name ||", v_price = " || v_price);
17
18    END LOOP;
19
20    CLOSE giftCursor;
21
22  END;
23  /

v_gift_id = 1, v_name = Flower, v_price = 19.95 v_gift_id = 2, v_name = Computer, v_price = 30 v_gift_id = 3, v_name = iPod, v_price = 25.99 v_gift_id = 4, v_name = iPhone, v_price = 13.95 v_gift_id = 5, v_name = Book, v_price = 49.99 PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table gifts; Table dropped.

 </source>
   
  


Fetches the records from a cursor variable that returns employee information

   <source lang="sql">

SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


---------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester 8 rows selected. SQL> SQL> set serverout on; SQL> SQL> -- fetches the records from a cursor variable that returns employee information SQL> SQL> DECLARE

 2     TYPE employee_ref_cursor_type IS REF CURSOR
 3     RETURN employee%ROWTYPE;
 4
 5     employee_ref_cursor employee_ref_cursor_type;
 6
 7     employee_record employee%ROWTYPE;
 8  BEGIN
 9     OPEN employee_ref_cursor FOR SELECT * FROM employee;
10
11     LOOP
12          /* Fetch the first record from the cursor */
13          FETCH employee_ref_cursor INTO employee_record;
14
15          /* Exit when last record retrieved from cursor */
16          EXIT WHEN employee_ref_cursor%NOTFOUND;
17
18          DBMS_OUTPUT.PUT_LINE("Employee name is: "|| employee_record.first_name);
19     END LOOP;
20
21     CLOSE employee_ref_cursor;
22  END;
23  /

Employee name is: Jason Employee name is: Alison Employee name is: James Employee name is: Celia Employee name is: Robert Employee name is: Linda Employee name is: David Employee name is: James PL/SQL procedure successfully completed. SQL> SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL>


 </source>
   
  


Fetch out cursor value and insert to another table

   <source lang="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> 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> CREATE TABLE MyTable (

 2    num_col    NUMBER,
 3    char_col   VARCHAR2(60)
 4    );

Table created. SQL> SQL> SQL> SQL> DECLARE

 2    CURSOR MyHistoryLecturer IS
 3      SELECT id, first_name, last_name
 4        FROM lecturer
 5        WHERE major = "History";
 6  BEGIN
 7    FOR myLecturer IN MyHistoryLecturer LOOP
 8      INSERT INTO myStudent (student_id, department, course)
 9        VALUES (myLecturer.ID, "HIS", 101);
10
11      INSERT INTO MyTable (num_col, char_col)
12        VALUES (myLecturer.ID,
13                myLecturer.first_name || " " || myLecturer.last_name);
14
15    END LOOP;
16
17    COMMIT;
18  END;
19  /

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 myStudent; Table dropped. SQL> drop table lecturer; Table dropped. SQL>

 </source>
   
  


Fetch row by row

   <source lang="sql">

SQL> CREATE TABLE EMP(

 2      EMPNO NUMBER(4) NOT NULL,
 3      ENAME VARCHAR2(10),
 4      JOB VARCHAR2(9),
 5      MGR NUMBER(4),
 6      HIREDATE DATE,
 7      SAL NUMBER(7, 2),
 8      COMM NUMBER(7, 2),
 9      DEPTNO NUMBER(2)
10  );

Table created. SQL> INSERT INTO EMP VALUES(2, "Jack", "Tester", 6,TO_DATE("20-FEB-1981", "DD-MON-YYYY"), 1600, 300, 30); 1 row created. SQL> INSERT INTO EMP VALUES(3, "Wil", "Tester", 6,TO_DATE("22-FEB-1981", "DD-MON-YYYY"), 1250, 500, 30); 1 row created. SQL> INSERT INTO EMP VALUES(4, "Jane", "Designer", 9,TO_DATE("2-APR-1981", "DD-MON-YYYY"), 2975, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(5, "Mary", "Tester", 6,TO_DATE("28-SEP-1981", "DD-MON-YYYY"), 1250, 1400, 30); 1 row created. SQL> INSERT INTO EMP VALUES(7, "Chris", "Designer", 9,TO_DATE("9-JUN-1981", "DD-MON-YYYY"), 2450, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES(8, "Smart", "Helper", 4,TO_DATE("09-DEC-1982", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> INSERT INTO EMP VALUES(9, "Peter", "Manager", NULL,TO_DATE("17-NOV-1981", "DD-MON-YYYY"), 5000, NULL, 10); 1 row created. SQL> INSERT INTO EMP VALUES(10, "Take", "Tester", 6,TO_DATE("8-SEP-1981", "DD-MON-YYYY"), 1500, 0, 30); 1 row created. SQL> INSERT INTO EMP VALUES(13, "Fake", "Helper", 4,TO_DATE("3-DEC-1981", "DD-MON-YYYY"), 3000, NULL, 20); 1 row created. SQL> SQL> variable x refcursor SQL> declare

 2   r emp%rowtype;
 3   begin
 4       :x := emp_list;
 5   loop
 6       fetch :x into r;
 7       exit when :x%notfound;
 8       dbms_output.put_line(r.empno||","||r.hiredate);
 9   end loop;
10   close :x;
11  end;
12  /

2,20-02-1981 3,22-02-1981 4,02-04-1981 5,28-09-1981 7,09-06-1981 8,09-12-1982 9,17-11-1981 10,08-09-1981 13,03-12-1981 PL/SQL procedure successfully completed. SQL> SQL> drop table emp; Table dropped.

 </source>
   
  


Fetch single column cursor to varchar2 variable

   <source lang="sql">

SQL> CREATE TABLE products(

 2    product_id              NUMBER(6),
 3    name            VARCHAR2(50)
 4  );

Table created. SQL> SQL> SQL> SQL> declare

 2      v_name varchar2(80);
 3      cursor get_data is select name from products;
 4    begin
 5       open get_data;
 6       fetch get_data into v_name;
 7       dbms_output.put_line(v_name);
 8       close get_data;
 9  end;
10  /

PL/SQL procedure successfully completed. SQL> SQL> SQL> drop table products; Table dropped.

 </source>
   
  


Fetch value from cursor

   <source lang="sql">

SQL> SQL> -- create demo table SQL> create table Employee(

 2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
 3    First_Name         VARCHAR2(10 BYTE),
 4    Last_Name          VARCHAR2(10 BYTE),
 5    Start_Date         DATE,
 6    End_Date           DATE,
 7    Salary             Number(8,2),
 8    City               VARCHAR2(10 BYTE),
 9    Description        VARCHAR2(15 BYTE)
10  )
11  /

Table created. SQL> SQL> -- prepare data SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 6661.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 6544.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2344.78, "Vancouver","Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 4322.78,"New York",  "Tester")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 7897.78,"New York",  "Manager")
 3  /

1 row created. SQL> insert into Employee(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)

 2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 1232.78,"Vancouver", "Tester")
 3  /

1 row created. SQL> SQL> SQL> SQL> -- display data in the table SQL> select * from Employee

 2  /

ID FIRST_NAME LAST_NAME START_DAT END_DATE SALARY CITY DESCRIPTION


---------- ---------- --------- --------- ---------- ---------- ---------------

01 Jason Martin 25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 02 Alison Mathews 21-MAR-76 21-FEB-86 6661.78 Vancouver Tester 03 James Smith 12-DEC-78 15-MAR-90 6544.78 Vancouver Tester 04 Celia Rice 24-OCT-82 21-APR-99 2344.78 Vancouver Manager 05 Robert Black 15-JAN-84 08-AUG-98 2334.78 Vancouver Tester 06 Linda Green 30-JUL-87 04-JAN-96 4322.78 New York Tester 07 David Larry 31-DEC-90 12-FEB-98 7897.78 New York Manager 08 James Cat 17-SEP-96 15-APR-02 1232.78 Vancouver Tester 8 rows selected. SQL> SQL> SQL> SQL> declare

 2      cursor employeeCursor
 3      is select e.first_name || " " || e.last_name name, e.salary
 4           from employee e;
 5
 6      name       varchar2(200);
 7      salary     number(9,2);
 8    begin
 9      for c1 in (select avg(e.salary) avg_salary
10                   from employee e) loop
11        dbms_output.put_line("average salary "||c1.avg_salary);
12      end loop;
13
14      open employeeCursor;
15      fetch employeeCursor into name, salary;
16
17      dbms_output.put_line(chr(13) || chr(13));
18      dbms_output.put_line("EmployeeS");
19      dbms_output.put_line("------------------------");
20
21      while employeeCursor%FOUND loop
22        dbms_output.put_line(name || " makes $" || salary);
23        fetch employeeCursor into name, salary;
24      end loop;
25      close employeeCursor;
26    end;
27    /

average salary 4071.7525 EmployeeS


Jason Martin makes $1234.56 Alison Mathews makes $6661.78 James Smith makes $6544.78 Celia Rice makes $2344.78 Robert Black makes $2334.78 Linda Green makes $4322.78 David Larry makes $7897.78 James Cat makes $1232.78 PL/SQL procedure successfully completed. SQL> SQL> SQL> SQL> SQL> SQL> -- clean the table SQL> drop table Employee

 2  /

Table dropped. SQL> SQL> SQL> SQL>


 </source>
   
  


Fetch value in cursor until NOTFOUND

   <source lang="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 session (

 2    department       CHAR(3),
 3    course           NUMBER(3),
 4    description      VARCHAR2(2000),
 5    max_lecturer     NUMBER(3),
 6    current_lecturer NUMBER(3),
 7    num_credits      NUMBER(1),
 8    room_id          NUMBER(5)
 9    );

Table created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 101, "History 101", 30, 11, 4, 20000);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 301, "History 301", 30, 0, 4, 20004);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 101, "Computer Science 101", 50, 0, 4, 20001);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 203, "Economics 203", 15, 0, 3, 20002);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 102, "Computer Science 102", 35, 3, 4, 20003);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 410, "Music 410", 5, 4, 3, 20005);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 101, "Economics 101", 50, 0, 4, 20007);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("NUT", 307, "Nutrition 307", 20, 2, 4, 20008);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 100, "Music 100", 100, 0, 3, NULL);

1 row created. SQL> SQL> DECLARE

 2    TYPE t_Cursor IS REF CURSOR;
 3    v_Cursor t_Cursor;
 4    myLecturer lecturer%ROWTYPE;
 5    v_Class session%ROWTYPE;
 6  BEGIN
 7    OPEN v_Cursor FOR
 8      SELECT * FROM lecturer WHERE current_credits >= 8;
 9
10    LOOP
11      FETCH v_Cursor INTO myLecturer;
12      EXIT WHEN v_Cursor%NOTFOUND;
13
14      DBMS_OUTPUT.PUT_LINE(myLecturer.first_name || " " || myLecturer.last_name ||
15        " has " || myLecturer.current_credits || " credits.");
16
17    END LOOP;
18
19    CLOSE v_Cursor;
20
21    OPEN v_Cursor FOR
22      SELECT * FROM session WHERE department = "ECN";
23    DBMS_OUTPUT.PUT_LINE("The Economics session are: ");
24    LOOP
25      FETCH v_Cursor INTO v_Class;
26      EXIT WHEN v_Cursor%NOTFOUND;
27
28      DBMS_OUTPUT.PUT_LINE(v_Class.description);
29    END LOOP;
30
31    CLOSE v_Cursor;
32  END;
33  /

Scott Lawson has 11 credits. Jone Bliss has 8 credits. Man Kyte has 8 credits. Chris Elegant has 8 credits. Rita Johnson has 8 credits. The Economics session are: Economics 203 Economics 101 PL/SQL procedure successfully completed. SQL> SQL> drop table session; Table dropped. SQL> SQL> drop table lecturer; Table dropped. SQL>

 </source>
   
  


legal and illegal FETCH statements.

   <source lang="sql">
 

SQL> SQL> SQL> CREATE TABLE session (

 2    department       CHAR(3),
 3    course           NUMBER(3),
 4    description      VARCHAR2(2000),
 5    max_lecturer     NUMBER(3),
 6    current_lecturer NUMBER(3),
 7    num_credits      NUMBER(1),
 8    room_id          NUMBER(5)
 9    );

Table created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 101, "History 101", 30, 11, 4, 20000);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 301, "History 301", 30, 0, 4, 20004);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 101, "Computer Science 101", 50, 0, 4, 20001);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 203, "Economics 203", 15, 0, 3, 20002);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 102, "Computer Science 102", 35, 3, 4, 20003);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 410, "Music 410", 5, 4, 3, 20005);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 101, "Economics 101", 50, 0, 4, 20007);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("NUT", 307, "Nutrition 307", 20, 2, 4, 20008);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 100, "Music 100", 100, 0, 3, NULL);

1 row created. SQL> SQL> select * from session; DEP COURSE --- -------- DESCRIPTION



MAX_LECTURER CURRENT_LECTURER NUM_CREDITS ROOM_ID


---------------- ----------- --------

HIS 101.00 History 101

      30.00            11.00        4.00 ########

HIS 301.00 History 301

      30.00              .00        4.00 ########

DEP COURSE --- -------- DESCRIPTION



MAX_LECTURER CURRENT_LECTURER NUM_CREDITS ROOM_ID


---------------- ----------- --------

CS 101.00 Computer Science 101

      50.00              .00        4.00 ########

ECN 203.00 Economics 203 DEP COURSE --- -------- DESCRIPTION



MAX_LECTURER CURRENT_LECTURER NUM_CREDITS ROOM_ID


---------------- ----------- --------
      15.00              .00        3.00 ########

CS 102.00 Computer Science 102

      35.00             3.00        4.00 ########

MUS 410.00 DEP COURSE --- -------- DESCRIPTION



MAX_LECTURER CURRENT_LECTURER NUM_CREDITS ROOM_ID


---------------- ----------- --------

Music 410

       5.00             4.00        3.00 ########

ECN 101.00 Economics 101

      50.00              .00        4.00 ########

DEP COURSE --- -------- DESCRIPTION



MAX_LECTURER CURRENT_LECTURER NUM_CREDITS ROOM_ID


---------------- ----------- --------

NUT 307.00 Nutrition 307

      20.00             2.00        4.00 ########

MUS 100.00 Music 100

     100.00              .00        3.00

DEP COURSE --- -------- DESCRIPTION



MAX_LECTURER CURRENT_LECTURER NUM_CREDITS ROOM_ID


---------------- ----------- --------

9 rows selected. SQL> SQL> DECLARE

 2    v_Department  session.department%TYPE;
 3    v_Course      session.course%TYPE;
 4    CURSOR myAllSession IS
 5      SELECT *
 6        FROM session;
 7    v_sessionRecord  myAllSession%ROWTYPE;
 8  BEGIN
 9    OPEN myAllSession;
10
11    FETCH myAllSession INTO v_sessionRecord;
12
13    FETCH myAllSession INTO v_Department, v_Course;
14  END;
15  /
 FETCH myAllSession INTO v_Department, v_Course;
 *

ERROR at line 13: ORA-06550: line 13, column 3: PLS-00394: wrong number of values in the INTO list of a FETCH statement ORA-06550: line 13, column 3: PL/SQL: SQL Statement ignored

SQL> SQL> drop table session; Table dropped. SQL>

 </source>
   
  


ORA-01002: fetch out of sequence

   <source lang="sql">
 

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> SQL> SQL> DECLARE

 2    CURSOR myAllLecturer IS
 3      SELECT *
 4        FROM lecturer
 5        FOR UPDATE;
 6
 7    myLecturer  myAllLecturer%ROWTYPE;
 8  BEGIN
 9    OPEN myAllLecturer;
10    FETCH myAllLecturer INTO myLecturer;
11    COMMIT WORK;
12    FETCH myAllLecturer INTO myLecturer;
13  END;
14  /

DECLARE

ERROR at line 1: ORA-01002: fetch out of sequence ORA-06512: at line 12

SQL> SQL> SQL> drop table lecturer; Table dropped. SQL> SQL> SQL>

 </source>
   
  


"ORA-1002: fetch out of sequence" because of the commit inside the SELECT..FOR UPDATE loop.

   <source lang="sql">
 

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> select * from lecturer;

     ID FIRST_NAME           LAST_NAME            MAJOR                          CURRENT_CREDITS

-------------------- -------------------- ------------------------------ ---------------
                1. Scott Lawson Computer Science 11.00
                2. Mar Wells History 4.00
                3. Jone Bliss Computer Science 8.00
                4. Man Kyte Economics 8.00
                5. Pat Poll History 4.00
                6. Tim Viper History 4.00
                7. Barbara Blues Economics 7.00
                8. David Large Music 4.00
                9. Chris Elegant Nutrition 8.00
                10. Rose Bond Music 7.00
                11. Rita Johnson Nutrition 8.00
     ID FIRST_NAME           LAST_NAME            MAJOR                          CURRENT_CREDITS

-------------------- -------------------- ------------------------------ ---------------
                1. Sharon Clear Computer Science 3.00

12 rows selected. SQL> SQL> DECLARE

 2    CURSOR myAllLecturer IS
 3      SELECT *
 4        FROM lecturer
 5        FOR UPDATE;
 6
 7    myLecturer  myAllLecturer%ROWTYPE;
 8  BEGIN
 9    OPEN myAllLecturer;
10
11    FETCH myAllLecturer INTO myLecturer;
12
13    COMMIT;
14
15    FETCH myAllLecturer INTO myLecturer;
16  END;
17  /

DECLARE

ERROR at line 1: ORA-01002: fetch out of sequence ORA-06512: at line 15

SQL> SQL> drop table lecturer; Table dropped. SQL>

 </source>
   
  


PLS-00394: wrong number of values in the INTO list of a FETCH statement

   <source lang="sql">
 

SQL> CREATE TABLE session (

 2    department       CHAR(3),
 3    course           NUMBER(3),
 4    description      VARCHAR2(2000),
 5    max_lecturer     NUMBER(3),
 6    current_lecturer NUMBER(3),
 7    num_credits      NUMBER(1),
 8    room_id          NUMBER(5)
 9    );

Table created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 101, "History 101", 30, 11, 4, 20000);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("HIS", 301, "History 301", 30, 0, 4, 20004);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 101, "Computer Science 101", 50, 0, 4, 20001);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 203, "Economics 203", 15, 0, 3, 20002);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("CS", 102, "Computer Science 102", 35, 3, 4, 20003);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 410, "Music 410", 5, 4, 3, 20005);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("ECN", 101, "Economics 101", 50, 0, 4, 20007);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("NUT", 307, "Nutrition 307", 20, 2, 4, 20008);

1 row created. SQL> SQL> INSERT INTO session(department, course, description, max_lecturer, current_lecturer, num_credits, room_id)

 2              VALUES ("MUS", 100, "Music 100", 100, 0, 3, NULL);

1 row created. SQL> SQL> SQL> DECLARE

 2    v_Department  session.department%TYPE;
 3    v_Course      session.course%TYPE;
 4    CURSOR myAllSession IS
 5      SELECT *
 6        FROM session;
 7    v_sessionRecord  myAllSession%ROWTYPE;
 8  BEGIN
 9    OPEN myAllSession;
10
11    FETCH myAllSession INTO v_sessionRecord;
12
13    FETCH myAllSession INTO v_Department, v_Course;
14  END;
15  /
 FETCH myAllSession INTO v_Department, v_Course;
 *

ERROR at line 13: ORA-06550: line 13, column 3: PLS-00394: wrong number of values in the INTO list of a FETCH statement ORA-06550: line 13, column 3: PL/SQL: SQL Statement ignored

SQL> SQL> drop table session; Table dropped. SQL> SQL>

 </source>