---------------------------------------------------------------------------- -- (c) Copyright IBM Corp. 2007 All rights reserved. -- -- The following sample of source code ("Sample") is owned by International -- Business Machines Corporation or one of its subsidiaries ("IBM") and is -- copyrighted and licensed, not sold. You may use, copy, modify, and -- distribute the Sample in any form without payment to IBM, for the purpose of -- assisting you in the development of your applications. -- -- The Sample code is provided to you on an "AS IS" basis, without warranty of -- any kind. IBM HEREBY EXPRESSLY DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR -- IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -- MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Some jurisdictions do -- not allow for the exclusion or limitation of implied warranties, so the above -- limitations or exclusions may not apply to you. IBM shall not be liable for -- any damages you suffer as a result of using, copying, modifying or -- distributing the Sample, even if IBM has been advised of the possibility of -- such damages. ---------------------------------------------------------------------------- -- -- SOURCE FILE NAME: nestedsp.db2 -- -- SAMPLE: To create the OUT_AVERAGE, OUT_MEDIAN and MAX_SALARY SQL procedures -- which are used to calculate the average salary, median salary and -- maximum salary of the EMPLOYEE table respectively. -- -- To create the SQL procedures: -- 1. Connect to the database -- 2. Enter the command "db2 -td@ -vf nestedsp.db2" -- -- To call the SQL procedure from the command line: -- 1. Connect to the database -- 2. Enter the following command: -- db2 "CALL out_average (?,?,?)" -- -- To drop the SQL stored procedures created with nestedsp.db2 script: -- 1. Connect to the database -- 2. Enter the command "db2 -td@ -vf nestedspdrop.db2" -- -- You can also call this SQL procedure by compiling and running the -- Java client application using the NestedSP.java -- source file available in the sqlpl samples directory. ---------------------------------------------------------------------------- CREATE PROCEDURE MAX_SALARY (OUT maxSalary DOUBLE) LANGUAGE SQL READS SQL DATA BEGIN SELECT MAX(salary) INTO maxSalary FROM staff; END @ CREATE PROCEDURE OUT_MEDIAN (OUT medianSalary DOUBLE, OUT maxSalary DOUBLE) DYNAMIC RESULT SETS 0 LANGUAGE SQL MODIFIES SQL DATA BEGIN DECLARE v_numRecords INT DEFAULT 1; DECLARE v_counter INT DEFAULT 0; DECLARE v_mod INT DEFAULT 0; DECLARE v_salary1 DOUBLE DEFAULT 0; DECLARE v_salary2 DOUBLE DEFAULT 0; DECLARE c1 CURSOR FOR SELECT CAST(salary AS DOUBLE) FROM staff ORDER BY salary; SELECT COUNT(*) INTO v_numRecords FROM staff; SET v_mod = MOD(v_numRecords, 2); OPEN c1; CASE v_mod WHEN 0 THEN WHILE v_counter < (v_numRecords / 2 + 1) DO SET v_salary1 = v_salary2; FETCH c1 INTO v_salary2; SET v_counter = v_counter + 1; END WHILE; SET medianSalary = (v_salary1 + v_salary2)/2; WHEN 1 THEN WHILE v_counter < (v_numRecords / 2 + 1) DO FETCH c1 INTO medianSalary; SET v_counter = v_counter + 1; END WHILE; END CASE; CLOSE c1; CALL MAX_SALARY(maxSalary); END @ CREATE PROCEDURE OUT_AVERAGE (OUT averageSalary DOUBLE, OUT medianSalary DOUBLE, OUT maxSalary DOUBLE) DYNAMIC RESULT SETS 2 LANGUAGE SQL MODIFIES SQL DATA BEGIN DECLARE r1 CURSOR WITH RETURN TO CLIENT FOR SELECT name, job, CAST(salary AS DOUBLE) FROM staff WHERE salary > averageSalary ORDER BY name ASC; DECLARE r2 CURSOR WITH RETURN TO CLIENT FOR SELECT name, job, CAST(salary AS DOUBLE) FROM staff WHERE salary < averageSalary ORDER BY name ASC; SELECT AVG(salary) INTO averageSalary FROM staff; CALL OUT_MEDIAN(medianSalary, maxSalary); -- open the cursors to return result sets OPEN r1; OPEN r2; END @