100% found this document useful (2 votes)
5K views

Using Multiple Cursors

This document provides questions and answers about using multiple cursors in PL/SQL. The key points are: 1. Using two cursors and a Cartesian product to join every employee to every department would be inefficient, as it would display 1100 lines of output but only read the employee rows once. 2. When using multiple cursors, one should open the cursor that takes a parameter after fetching the value to pass to it from the first cursor. 3. To produce a report with departments and their employees, the employee cursor should take the department ID as a parameter. 4. Two cursors are useful when working with related data from two tables to produce a multi-level report. 5

Uploaded by

Catalina Achim
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
5K views

Using Multiple Cursors

This document provides questions and answers about using multiple cursors in PL/SQL. The key points are: 1. Using two cursors and a Cartesian product to join every employee to every department would be inefficient, as it would display 1100 lines of output but only read the employee rows once. 2. When using multiple cursors, one should open the cursor that takes a parameter after fetching the value to pass to it from the first cursor. 3. To produce a report with departments and their employees, the employee cursor should take the department ID as a parameter. 4. Two cursors are useful when working with related data from two tables to produce a multi-level report. 5

Uploaded by

Catalina Achim
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

Test: Quiz: Using Multiple Cursors 1.

Assume that table BIGDEPTS contains 100 rows, and table BIGEMPS contains 1000 rows, with 10 employees in each department. Consider the following code: DECLARE CURSOR bigdept_cur IS SELECT * FROM bigdepts; CURSOR bigemp_cur IS SELECT * FROM bigemps; BEGIN FOR dept_rec IN bigdept_cur LOOP DBMS_OUTPUT.PUT_LINE (dept_rec.department_name); FOR emp_rec IN bigemp_cur LOOP IF emp_rec.department_id=dept_rec.department_id THEN DBMS_OUTPUT.PUT_LINE (emp_rec.last_name); END IF; END LOOP; END LOOP; END; Why is this code inefficient? Mark for Review (1) Points It locks both tables unnecessarily. It is using two cursors when one cursor is enough. It is doing a Cartesian Product, joining every employee with every depar tment and displaying 1100 lines of output. It reads 1000 employee rows every time BIGEMP_CUR is OPENed, and then ig nores 990 of them. (*) It is using cursor FOR loops, which are less efficient than OPENing and CLOSEing the cursors explicitly.

Correct 2. Examine the following code: DECLARE CURSOR region_cur IS SELECT * FROM wf_world_regions; v_region_rec region_cur%ROWTYPE; CURSOR country_cur (p_region_id NUMBER) IS SELECT * FROM wf_countries WHERE region_id = p_region_id; v_country_rec country_cur%ROWTYPE; BEGIN OPEN region_cur; LOOP FETCH region_cur INTO v_region_rec;

EXIT WHEN region_cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE (v_region_rec.region_name); -- Line A -LOOP FETCH country_cur INTO v_country_rec; EXIT WHEN country_cur%NOTFOUND; ...... What would you code at Line A? Mark for Review (1) Points OPEN country_cur (p_region_id); OPEN country_cur (wf_world_regions.region_id); OPEN country_cur (v_region_rec.region_id); (*) OPEN country_cur (region_cur.region_id); OPEN country_cur;

Correct 3. You want to produce a report which displays each department and (immediately after each department) a list of employees who work in that depart ment. You declare a DEPARTMENTS cursor as: CURSOR dept_curs IS SELECT * FROM departments ORDER BY department_id; How could you declare the EMPLOYEES cursor? (Choose two). Mark for Review (1) Points (Choose all correct answers) CURSOR emp_curs IS SELECT * FROM employees; CURSOR emp_curs (p_dept_id NUMBER) IS SELECT * FROM employees WHERE department_id = p_dept_id; (*)

CURSOR emp_curs IS

SELECT * FROM employees ORDER BY department_id; CURSOR emp_curs (p_dept_id departments.department_id%TYPE) IS SELECT * FROM employees WHERE department_id = p_dept_id; (*)

CURSOR emp_curs IS SELECT * FROM employees WHERE department_id = departments.department_id;

Incorrect. Refer to Section 5 Lesson 6. 4. Which of the following is a good reason to use two cursors in a single PL/SQL block? Mark for Review (1) Points To allow one cursor to be opened twice at the same time. When two tables are related to each other (often by a foreign key) and w e want to produce a multilevel report using data from both tables. (*) To allow rows to be locked as they are FETCHed. To speed up the execution of the PL/SQL block. It is the only way to declare a cursor with a parameter.

Correct 5. Which of the following is NOT allowed when using multiple cursors with parameters? Mark for Review (1) Points You cannot use cursor FOR loops. You cannot declare the cursors FOR UPDATE. You cannot declare a cursor based on a join. You cannot OPEN more than one cursor at the same time.

None of the above, they are all allowed. (*)

Correct 6. Assume your schema contains 25 tables. How many explicit cursors can yo u declare and use within a single PL/SQL block? Mark for Review (1) Points Only one. As many as you need - there is no limit. (*) A maximum of three. As many as you need, but only one of them can be open at any time. A maximum of 25 (one for each table in your schema).

Correct

You might also like