CREATE TABLE employees
AS
SELECT * FROM hr.employees
Table created.
Nested Blocks
DECLARE
l_name employees.last_name%TYPE;
BEGIN
<<show_name>>
BEGIN
SELECT employee_id
INTO l_name
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.put_line ('Old name=' || l_name);
END show_name;
<<change_name>>
BEGIN
UPDATE employees
SET last_name = UPPER (last_name)
WHERE employee_id = 100
RETURNING last_name INTO l_name;
DBMS_OUTPUT.put_line ('New name= ' || l_name);
END change_name;
END;
Old name=100
New name= KING
Nested Subprograms
DECLARE
PROCEDURE show_name
IS
l_name employees.last_name%TYPE;
BEGIN
SELECT employee_id
INTO l_name
FROM employees
WHERE employee_id = 100;
DBMS_OUTPUT.put_line ('Old name=' || l_name);
END show_name;
PROCEDURE change_name
IS
l_name employees.last_name%TYPE;
BEGIN
UPDATE employees
SET last_name = UPPER (last_name)
WHERE employee_id = 100
RETURNING last_name INTO l_name;
DBMS_OUTPUT.put_line ('New name= ' || l_name);
END change_name;
BEGIN
show_name;
change_name;
END;
Old name=100
New name= KING
Watch out Out-of-Scope Global References!
CREATE OR REPLACE PROCEDURE with_filter (filter_in IN VARCHAR2)
IS
PROCEDURE show_name
IS
l_name employees.last_name%TYPE;
BEGIN
SELECT employee_id
INTO l_name
FROM employees
WHERE employee_id = 100 AND last_name LIKE filter_in;
DBMS_OUTPUT.put_line ('Old name=' || l_name);
END show_name;
PROCEDURE change_name
IS
l_name employees.last_name%TYPE;
BEGIN
UPDATE employees
SET last_name = UPPER (last_name)
WHERE employee_id = 100 AND last_name LIKE filter_in
RETURNING last_name
INTO l_name;
DBMS_OUTPUT.put_line ('New name= ' || l_name);
END change_name;
BEGIN
show_name;
change_name;
END;
Procedure created.
Pass Program Unit "Globals" as Parameters
CREATE OR REPLACE PROCEDURE with_filter (filter_in IN VARCHAR2)
IS
PROCEDURE show_name (filter_in IN VARCHAR2)
IS
l_name employees.last_name%TYPE;
BEGIN
SELECT employee_id
INTO l_name
FROM employees
WHERE employee_id = 100 AND last_name LIKE filter_in;
DBMS_OUTPUT.put_line ('Old name=' || l_name);
END show_name;
PROCEDURE change_name (filter_in IN VARCHAR2)
IS
l_name employees.last_name%TYPE;
BEGIN
UPDATE employees
SET last_name = UPPER (last_name)
WHERE employee_id = 100 AND last_name LIKE filter_in
RETURNING last_name
INTO l_name;
DBMS_OUTPUT.put_line ('New name= ' || l_name);
END change_name;
BEGIN
show_name (filter_in);
change_name (filter_in);
END;
Procedure created.