Database Programming With PL/SQL 12-2: Practice Activities
Database Programming With PL/SQL 12-2: Practice Activities
com/academy
means that the same input value will always produce the same
output value, and must be used to create a function-based index on
DETERMINISTIC Clause your own functions.
Try It / Solve It
1. Run this code to load 25,000 records into a local nested table and pass these values to two
local procedures that do nothing. Notice the call to the subprogram using NOCOPY. What
are the results?
DECLARE t1
NUMBER;
t2 NUMBER;
t3 NUMBER;
BEGIN
SELECT * INTO nocopy_test.emp_tab(1) FROM EMPLOYEES WHERE
employee_id = 100;
nocopy_test.emp_tab.EXTEND(49999, 1); -- Copy element 1 into 2..50000
nocopy_test.get_time(t1);
nocopy_test.do_nothing1(nocopy_test.emp_tab); -- Pass IN OUT parameter
nocopy_test.get_time(t2);
nocopy_test.do_nothing2(nocopy_test.emp_tab); -- Pass IN OUT NOCOPY parameter
nocopy_test.get_time(t3);
DBMS_OUTPUT.PUT_LINE ('Call Duration (secs)');
DBMS_OUTPUT.PUT_LINE ('--------------------');
DBMS_OUTPUT.PUT_LINE ('Just IN OUT: ' || TO_CHAR((t2 - t1)/100.0));
DBMS_OUTPUT.PUT_LINE ('With NOCOPY: ' || TO_CHAR((t3 - t2))/100.0);
END;
Execute the following SELECT statement to find out salaries before executing the
raise_salary procedure:
SELECT salary
FROM employees
WHERE employee_id = 100 OR employee_id = 102
OR employee_id = 104 OR employee_id = 100;
BEGIN
raise_salary(10);
END;
SELECT salary
FROM employees
WHERE employee_id = 100 OR employee_id = 102
OR employee_id = 104 OR employee_id = 100;
3. Create and execute an anonymous block containing the BULK COLLECT and
RETURNING clause that deletes all employees in department_id 20 from the EMP_TEMP
table. Create the EMP_TEMP table from the EMPLOYEES table. Your anonymous block
should produce results that look similar to this (your results may vary depending on
previous changes you may have made to the EMPLOYEES table):