-- File: proc2.sql
-- Creates and demonstrates stored procedures
-- 1. A procedure with parameters - Give all salesmen a specified amount
-- Don't respond yet to ';' statement delimiters inside the procedure,
-- save them until the procedure is executed
-- Remember to reset delimiter when finished: DELIMITER ;
DELIMITER //
DROP PROCEDURE IF EXISTS add_comm //
CREATE PROCEDURE add_comm( IN amount DECIMAL )
COMMENT 'Add commission for salesmen'
BEGIN
UPDATE emp1
SET comm = comm + amount
WHERE job = 'SALESMAN';
END //
----------------------------------------------------------------------
-- Verify definition - horizontal format not friendly
SHOW CREATE PROCEDURE add_comm //
SELECT 2 //
-- Verify definition - display fields in vertical format (\G)
SHOW CREATE PROCEDURE add_comm\G
-- Display further info about the procedure. Note wild-card '%'
SHOW PROCEDURE STATUS LIKE 'add%' \G
SELECT 3 //
----------------------------------------------------------------------
-- Now let's use the procedure
-- List the salesmen and their initial commissions
SELECT ename,
comm
FROM emp1
WHERE job = 'SALESMAN' //
-- now update their commissions with the ADD_COMM procedure
CALL add_comm(100) //
-- then list the salesmen and their updated commissions
SELECT ename,
comm
FROM emp1
WHERE job = 'SALESMAN' //
SELECT 4 //
----------------------------------------------------------------------
-- Creates a stored procedure called NEW_EMP
-- which adds a new recruit to the company
-- Usage: CALL new_emp('name', 'job');
DROP PROCEDURE IF EXISTS new_emp //
CREATE PROCEDURE
new_emp( IN name VARCHAR(20), IN job VARCHAR(20) )
COMMENT 'Add new employee to table'
BEGIN
DECLARE next_num INTEGER(4);
-- Get the highest Employee No
SELECT MAX(empno)
INTO next_num
FROM emp1;
-- Increment Employee No
SET next_num = next_num + 1;
-- Insert new row
INSERT INTO emp1 VALUES(
next_num,
UPPER(name),
UPPER(job),
NULL,
SYSDATE(),
0,
NULL,
NULL);
END //
-- Verify definition - display fields in vertical format (\G)
SHOW CREATE PROCEDURE new_emp\G
-- All procedures
SHOW PROCEDURE STATUS\G
SELECT 5 //
----------------------------------------------------------------------
-- Let's use the procedure to add a new employee
CALL new_emp('Rookie', 'Clerk') //
-- and see if it worked
SELECT *
FROM emp1
WHERE ename = 'ROOKIE' //
SELECT 6 //
----------------------------------------------------------------------
-- Let's modify new_emp, to output details of new employee
DROP PROCEDURE IF EXISTS new_emp //
CREATE PROCEDURE
new_emp( IN name VARCHAR(20), IN job VARCHAR(20) )
COMMENT 'Add new employee to table, display details'
BEGIN
DECLARE next_num INTEGER(4);
-- Get the highest Employee No
SELECT MAX(empno)
INTO next_num
FROM emp1;
-- Increment NEXT_NUM
SET next_num = next_num + 1;
-- Insert new row
INSERT INTO emp1 VALUES(
next_num,
UPPER(name),
UPPER(job),
NULL,
SYSDATE(),
0,
NULL,
NULL);
-- Display new row, using input parameter in WHERE clause
SELECT *
FROM emp1
WHERE ename = name;
END //
----------------------------------------------------------------------
-- Try the new procedure.
CALL new_emp('Starter', 'Trainee') //
-- Resetting delimiter does not work within script file!
-- Type the following (without the --) at the command prompt:
-- DELIMITER ;