Mega Code Archive

 
Categories / Oracle PLSQL Tutorial / Cursor
 

Use the cursor subquery

SQL> SQL> CREATE TABLE authors (   2    id         NUMBER PRIMARY KEY,   3    first_name VARCHAR2(50),   4    last_name  VARCHAR2(50)   5  ); Table created. SQL> SQL> CREATE TABLE books (   2    isbn      CHAR(10) PRIMARY KEY,   3    category  VARCHAR2(20),   4    title     VARCHAR2(100),   5    num_pages NUMBER,   6    price     NUMBER,   7    copyright NUMBER(4),   8    author1   NUMBER CONSTRAINT books_author1   9              REFERENCES authors(id),  10    author2   NUMBER CONSTRAINT books_author2  11              REFERENCES authors(id),  12    author3   NUMBER CONSTRAINT books_author3  13              REFERENCES authors(id)  14  ); Table created. SQL> SQL> INSERT INTO authors (id, first_name, last_name)   2    VALUES (1, 'Marlene', 'Theriault'); 1 row created. SQL> SQL> INSERT INTO authors (id, first_name, last_name)   2    VALUES (2, 'Rachel', 'Carmichael'); 1 row created. SQL> SQL> INSERT INTO authors (id, first_name, last_name)   2    VALUES (3, 'James', 'Viscusi'); 1 row created. SQL> SQL> INSERT INTO books (isbn, category, title, num_pages, price, copyright, author1, author2, author3)   2    VALUES ('72121203', 'Oracle Basics', 'Oracle DBA 101', 563, 39.99, 1999, 1, 2, 3); 1 row created. SQL> SQL> SET SERVEROUTPUT ON ESCAPE OFF SQL> SQL> DECLARE   2   3     cv_author SYS_REFCURSOR;   4     v_title BOOKS.TITLE%TYPE;   5     v_author AUTHORS%ROWTYPE;   6     v_counter PLS_INTEGER := 0;   7   8     CURSOR book_cur   9     IS  10        SELECT b.title,  11           CURSOR (SELECT *  12                   FROM authors a  13                   WHERE a.id = b.author1  14                   OR a.id = b.author2  15                   OR a.id = b.author3)  16        FROM books b  17        WHERE isbn = '78824389';  18  19  BEGIN  20  21     DBMS_OUTPUT.ENABLE(1000000);  22  23     OPEN book_cur;  24  25     LOOP  26        FETCH book_cur INTO v_title, cv_author;  27        EXIT WHEN book_cur%NOTFOUND;  28  29        v_counter := 0;  30  31        DBMS_OUTPUT.PUT_LINE('Title from the main cursor: '||v_title);  32  33        LOOP  34           FETCH cv_author INTO v_author;  35           EXIT WHEN cv_author%NOTFOUND;  36  37           v_counter := v_counter + 1;  38  39           DBMS_OUTPUT.PUT_LINE('Author'||v_counter||': '  40                                ||v_author.first_name||' '  41                                ||v_author.last_name);  42        END LOOP;  43     END LOOP;  44  45     CLOSE book_cur;  46  47  END;  48  / PL/SQL procedure successfully completed. SQL> SQL> drop table books; Table dropped. SQL> SQL> drop table authors; Table dropped. SQL>