Universal Database (netDB2) Introductory Guide
Stored Procedure Language (SPL)
An SQL procedure has a procedure body, which contains the source statements
for the stored procedure. The following example shows a CREATE PROCEDURE
statement for a simple stored procedure. The procedure name, the list of
parameters that are passed to or from the procedure, and the LANGUAGE
parameter are common to all stored procedures. However, the LANGUAGE value
of SQL and the BEGIN...END block, which forms the procedure body, are
particular to an SQL procedure. Once you have created stored procedures,
you can call them from within application programs using the SQL CALL
statement. You can also call SQL CALL statement from within the script center.
Syntax:
CREATE PROCEDURE UPDATE_SALARY_1 (1)
(IN EMPLOYEE_NUMBER integer, (2)
IN RATE INTEGER) (2)
LANGUAGE SQL (3)
BEGIN
UPDATE EMPLOYEE (4)
SET SALARY = SALARY * (1.0 * RATE / 100.0 )
WHERE EMPNO = EMPLOYEE_NUMBER;
END
@
|
- The stored procedure name is UPDATE_SALARY_1.
- The two parameters are of data type INTEGER. Both are input parameters.
- LANGUAGE SQL indicates that this is an SQL procedure, so a procedure body follows the other parameters.
- The procedure body consists of a single SQL UPDATE statement, which updates rows in the employee table.
('@') is used as the terminating character for stored procedures in NetDB2.
To test this stored procedure, first create the Employee table with
the required attributes. You can then call the stored procedure from
the script center using the following CALL statement.
CALL UPDATE_SALARY_1 (10666, 500);
|
The above procedure call will raise the salary of
the employee with employee number 10666 to 500% of his/her current
salary
CREATE PROCEDURE UPDATE_SALARY_IF
(IN employee_number INTEGER, IN rating SMALLINT)
LANGUAGE SQL
BEGIN
IF (rating = 1)
THEN UPDATE employee
SET salary = salary * 1.10, bonus = 1000
WHERE empno = employee_number;
ELSEIF (rating = 2)
THEN UPDATE employee
SET salary = salary * 1.05, bonus = 500
WHERE empno = employee_number;
ELSE UPDATE employee
SET salary = salary * 1.03, bonus = 0
WHERE empno = employee_number;
END IF;
END
@
|
The following example receives a department number as an input parameter. A WHILE statement in the procedure body fetches
the salary and bonus for each employee in the department. An IF statement within the WHILE statement updates
salaries for each employee depending on number of years of service and current salary. When all employee records
in the department have been processed, the FETCH statement that retrieves employee records receives SQLSTATE 20000.
A not_found condition handler makes the search condition for the WHILE statement false, so execution of
the WHILE statement ends.
CREATE PROCEDURE BUMP_SALARY_IF (IN deptnumber SMALLINT)
LANGUAGE SQL
BEGIN
DECLARE v_salary DOUBLE;
DECLARE v_years SMALLINT;
DECLARE v_id SMALLINT;
DECLARE at_end INT DEFAULT 0;
DECLARE not_found CONDITION FOR SQLSTATE '02000';
-- CAST salary as DOUBLE because SQL procedures do not support DECIMAL
DECLARE C1 CURSOR FOR
SELECT id, CAST(salary AS DOUBLE), years
FROM staff;
DECLARE CONTINUE HANDLER FOR not_found
SET at_end = 1;
OPEN C1;
FETCH C1 INTO v_id, v_salary, v_years;
WHILE at_end = 0 DO
IF (v_salary < 2000 * v_years)
THEN UPDATE staff
SET salary = 2150 * v_years
WHERE id = v_id;
ELSEIF (v_salary < 5000 * v_years)
THEN IF (v_salary < 3000 * v_years)
THEN UPDATE staff
SET salary = 3000 * v_years
WHERE id = v_id;
ELSE UPDATE staff
SET salary = v_salary * 1.10
WHERE id = v_id;
END IF;
ELSE UPDATE staff
SET job = 'PREZ'
WHERE id = v_id;
END IF;
FETCH C1 INTO v_id, v_salary, v_years;
END WHILE;
CLOSE C1;
END
@
|
|