4 Oracle PLSQL Part2 m4 Slides
4 Oracle PLSQL Part2 m4 Slides
!!
Pankaj Jain
!
@twit_pankajj
How to Pass Parameters?
!
[schema.]<function_or_procedure_name> (parameter1,….parameterN)
!
!
CREATE OR REPLACE FUNCTION get_tier(p_salary IN NUMBER) RETURN NUMBER IS
IN OUT IN OUT
▪ Multiple
▪ Overloading
▪ Formal
□ Declared in Subprogram Specification
□ No Constraints Specified
!
CREATE OR REPLACE PROCEDURE update_emp(p_dept_name IN VARCHAR2) RETURN NUMBER IS
!
CREATE OR REPLACE PROCEDURE update_emp(p_dept_name IN employee.emp_dept_id%TYPE)
RETURN NUMBER IS
!
▪ Actual
□ Variable or Expression Passed from Calling Client
! DECLARE
l_dept_name VARCHAR2(60):= 'IT'; Do Not Place Anything in
BEGIN This Space
! update_emp(l_dept_name); (Add watermark during editing)
Note: Warning will not appear
END;
during Slide Show view.
IN Mode
!
▪ Default Mode CREATE OR REPLACE
FUNCTION update_emp( p_emp_id IN NUMBER,
p_dept_name VARCHAR2)
▪ Read Only RETURN NUMBER AS
CURSOR cur_get_dept_id IS
DECLARE SELECT dept_id
l_emp_id NUMBER(10) := 50; FROM departments
l_dept_name VARCHAR2(60):= 'IT'; WHERE dept_name = p_dept_name;
l_status NUMBER; l_dept_id departments.dept_id%TYPE;
BEGIN BEGIN
p_emp_id := 20;
l_status := update_emp(l_emp_id,
l_dept_name); OPEN cur_get_dept_id;
END; FETCH cur_get_dept_id INTO l_dept_id;
CLOSE cur_get_dept_id;
UPDATE employee
DECLARE SET emp_dept_id = l_dept_id
l_status NUMBER; WHERE emp_id = p_emp_id;
BEGIN COMMIT;
l_status := update_emp(50, RETURN 1;
'IT' ); EXCEPTION
END; WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM); Do Not Place Anything in
ROLLBACK; This Space
RETURN 0; (Add watermark during editing)
END update_emp; Note: Warning will not appear
during Slide Show view.
Actual Parameter Value Ignored
!
OUT Mode Read & Write
!
Cannot Pass Literals or Constants
CREATE OR REPLACE
FUNCTION update_emp( p_emp_id IN NUMBER,
DECLARE p_dept_id NUMBER,
l_emp_id NUMBER(10) := 50; p_location OUT VARCHAR2)
l_dept_id NUMBER := 1; RETURN NUMBER AS
l_location VARCHAR2(10) :='CA'; BEGIN
l_status NUMBER; DBMS_OUTPUT.PUT_LINE('Location Initially '||p_location);
BEGIN UPDATE employee
l_status := update_emp(l_emp_id, SET emp_dept_id = p_dept_id
l_dept_id, WHERE emp_id = p_emp_id
'CA' l_location ); RETURNING emp_loc INTO p_location;
DBMS_OUTPUT.PUT_LINE('Location '||l_location); COMMIT;
DBMS_OUTPUT.PUT_LINE('Status '||l_status); RETURN 1;
END; EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
Location Initially DBMS_OUTPUT.PUT_LINE(
Location WA DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
Status 1 ROLLBACK;
RETURN 0;
END update_emp; Do Not Place Anything in
This Space
(Add watermark during editing)
Note: Warning will not appear
during Slide Show view.
IN OUT Mode
CREATE OR REPLACE
PROCEDURE update_emp( p_emp_id IN NUMBER,
p_dept_id NUMBER,
DECLARE
p_location OUT VARCHAR2,
l_emp_id NUMBER(10) := 50;
p_status IN OUT NUMBER) AS
l_dept_id NUMBER := 1;
BEGIN
l_location VARCHAR2(10) :='CA';
DBMS_OUTPUT.PUT_LINE('p_status Initially '|| p_status);
l_status NUMBER := -1;
UPDATE employee
BEGIN
SET emp_dept_id = p_dept_id
update_emp(l_emp_id,
WHERE emp_id = p_emp_id
l_dept_id,
RETURNING emp_loc INTO p_location;
l_location,
p_status := 1;
l_status);
COMMIT;
DBMS_OUTPUT.PUT_LINE(l_location);
EXCEPTION
DBMS_OUTPUT.PUT_LINE(l_status);
WHEN OTHERS THEN
END;
DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE(
p_status Initially -1 DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
Location WA ROLLBACK;
Status 1 p_status := 0;
END update_emp; Do Not Place Anything in
This Space
(Add watermark during editing)
Note: Warning will not appear
during Slide Show view.
Exception Inside Stored Subprogram
▪ Passed by Reference
CREATE OR REPLACE
□ IN PROCEDURE update_emp( p_emp_id IN NUMBER,
p_dept_id NUMBER,
p_location OUT VARCHAR2,
▪ Passed by Value p_status IN OUT NUMBER) AS
l_number NUMBER;
□ OUT & IN OUT BEGIN
UPDATE employee
DECLARE SET emp_dept_id = p_dept_id
l_emp_id NUMBER(10) := 50; WHERE emp_id = p_emp_id
l_dept_id NUMBER := 1; RETURNING emp_loc INTO p_location;
l_location VARCHAR2(10) :='CA'; p_status := 1;
l_status NUMBER := -1; l_number := 'CHAR';
BEGIN COMMIT;
update_emp(l_emp_id, EXCEPTION
l_dept_id, WHEN OTHERS THEN
l_location, DBMS_OUTPUT.PUT_LINE(SQLERRM);
l_status); DBMS_OUTPUT.PUT_LINE(
DBMS_OUTPUT.PUT_LINE(l_location); DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
DBMS_OUTPUT.PUT_LINE(l_status); ROLLBACK;
END; p_status := 0; Do Not Place Anything in
! p_location := null; This Space
(Add watermark during editing)
END update_emp;
WA Note: Warning will not appear
0 during Slide Show view.
Exception Inside Stored Subprogram
CREATE OR REPLACE
PROCEDURE update_emp( p_emp_id IN NUMBER,
DECLARE p_dept_id NUMBER,
l_emp_id NUMBER(10) := 50; p_location OUT VARCHAR2,
l_dept_id NUMBER := 1; p_status IN OUT NUMBER) AS
l_location VARCHAR2(10) :='CA'; l_number NUMBER;
l_status NUMBER := -1; BEGIN
BEGIN UPDATE employee
update_emp(l_emp_id, SET emp_dept_id = p_dept_id
l_dept_id, WHERE emp_id = p_emp_id
l_location, RETURNING emp_loc INTO p_location;
l_status); p_status := 1;
EXCEPTION l_number := 'CHAR';
WHEN OTHERS THEN COMMIT;
DBMS_OUTPUT.PUT_LINE(SQLERRM); EXCEPTION
DBMS_OUTPUT.PUT_LINE(l_location); WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(l_status); DBMS_OUTPUT.PUT_LINE(SQLERRM);
END; DBMS_OUTPUT.PUT_LINE(
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
ROLLBACK;
RAISE; Do Not Place Anything in
CA END update_emp; This Space
-1 (Add watermark during editing)
Note: Warning will not appear
during Slide Show view.
NOCOPY Hint
CREATE OR REPLACE
PROCEDURE update_emp( p_emp_id IN NUMBER,
p_dept_id NUMBER,
p_location OUT NOCOPY VARCHAR2,
DECLARE p_status IN OUT NOCOPY NUMBER)
l_emp_id NUMBER(10) := 50; AS
l_dept_id NUMBER := 1; l_number NUMBER;
l_location VARCHAR2(10) :='CA'; BEGIN
l_status NUMBER := -1; UPDATE employee
BEGIN SET emp_dept_id = p_dept_id
update_emp(l_emp_id, WHERE emp_id = p_emp_id
l_dept_id, RETURNING emp_loc INTO p_location;
l_location, p_status := 1;
l_status); l_number := 'CHAR';
EXCEPTION COMMIT;
WHEN OTHERS THEN EXCEPTION
DBMS_OUTPUT.PUT_LINE(SQLERRM); WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(l_location); DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE(l_status); DBMS_OUTPUT.PUT_LINE(
END; Do Not Place Anything in
DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
This Space
ROLLBACK; (Add watermark during editing)
WA RAISE; Note: Warning will not appear
1 END update_emp; during Slide Show view.
NoCopy Restrictions
▪ Compact
DECLARE
l_emp_id NUMBER(10) := 50;
l_dept_id NUMBER := 1;
l_location VARCHAR2(10) :='CA';
l_status NUMBER := -1;
CREATE OR REPLACE PROCEDURE BEGIN
update_emp( p_emp_id IN NUMBER, update_emp(l_emp_id,
p_dept_id NUMBER, l_dept_id,
p_location OUT VARCHAR2, l_location,
p_status IN OUT NUMBER) l_status);
……. END;
…….. Do Not Place Anything in
This Space
END update_emp;
(Add watermark during editing)
Note: Warning will not appear
during Slide Show view.
Named Notation
▪ Verbose
DECLARE DECLARE
l_emp_id NUMBER(10) := 50; l_emp_id NUMBER(10) := 50;
l_dept_id NUMBER := 1; l_dept_id NUMBER := 1;
l_location VARCHAR2(10) :='CA'; l_location VARCHAR2(10) :='CA';
l_status NUMBER := -1; l_status NUMBER := -1;
BEGIN BEGIN
update_emp(l_emp_id, update_emp(p_emp_id => l_emp_id,
l_dept_id, p_dept_id => l_dept_id,
p_status => l_status, l_status,
p_location => l_location); l_location);
END; END;
Do Not Place Anything in
This Space
(Add watermark during editing)
PLS-00312: Note: association
a positional parameter association may not follow a named Warning will not appear
during Slide Show view.
Default Values
!
<param_name> <param_mode><param_datatype> {:= | DEFAULT} def_val
!
CREATE OR REPLACE PROCEDURE
▪ IN Mode update_info ( p_emp_id IN NUMBER DEFAULT 50,
p_dept_id IN NUMBER DEFAULT 1,
p_bonus IN NUMBER DEFAULT 10)
…….
……..
END update_info;
DECLARE
l_emp_id NUMBER(10) := 30;
l_dept_id NUMBER := 2; DECLARE
BEGIN l_emp_id NUMBER(10) := 30;
l_bonus NUMBER := 5;
update_info; BEGIN
BEGIN
END; update_info(l_emp_id);
update_info(l_emp_id,
l_dept_id, END;
l_bonus);
Do Not Place Anything in
END; This Space
(Add watermark during editing)
Note: Warning will not appear
during Slide Show view.
Default Values
DECLARE
l_emp_id NUMBER(10) := 30;
BEGIN
update_emp(l_emp_id);
END;
DECLARE DECLARE
l_emp_id NUMBER(10) := 30; l_emp_id NUMBER(10) := 30;
l_dept_id NUMBER := 2; l_dept_id NUMBER := 2;
l_bonus NUMBER := 5; l_bonus NUMBER := 5;
BEGIN BEGIN Do Not Place Anything in
update_emp(l_emp_id, update_emp(p_emp_id => l_emp_id,
This Space
l_bonus); p_bonus => l_bonus);
(Add watermark during editing)
END; END; Note: Warning will not appear
during Slide Show view.
Constraints on Formal Parameters
CREATE OR REPLACE
PROCEDURE get_emp_loc ( p_emp_id IN NUMBER ,
p_location OUT VARCHAR2) AS
CURSOR get_loc IS
SELECT emp_loc
FROM employee
WHERE emp_id = p_emp_id;
BEGIN
p_location := 'NONE';
OPEN get_loc;
FETCH get_loc INTO p_location;
CLOSE get_loc; Do Not Place Anything in
! This Space
! p_location := NULL; (Add watermark during editing)
Note: Warning will not appear
END get_emp_loc; during Slide Show view.
Constraints on Formal Parameters
CREATE OR REPLACE
PROCEDURE get_emp_loc ( p_emp_id IN employee.emp_id%TYPE ,
p_location OUT employee.emp_loc%TYPE) AS
CURSOR get_loc IS
SELECT emp_loc
FROM employee
WHERE emp_id = p_emp_id;
BEGIN
p_location := 'NONE';
OPEN get_loc; Do Not Place Anything in
FETCH get_loc INTO p_location; This Space
CLOSE get_loc; (Add watermark during editing)
END get_emp_loc; Note: Warning will not appear
during Slide Show view.
Constraints on Formal Parameters
▪ Numeric Subtypes
□ NOT NULL Constraint Inherited
DECLARE
SUBTYPE numsubtype IS NUMBER(2) NOT NULL;
!
PROCEDURE testsubtype ( p_num IN numsubtype ) AS
BEGIN
DBMS_OUTPUT.PUT_LINE(p_num);
END testsubtype;
!
BEGIN
testsubtype(1234);
testsubtype(NULL);
END;
▪ Character Subtypes
□ NOT NULL Constraint Inherited
TEST
Do Not Place Anything in
This Space
PLS-00567: cannot pass NULL to a NOT NULL constrained formal (Add watermark during editing)
Note: Warning will not appear
parameter during Slide Show view.
Need for Parameters
!
Parameter Modes
!
Summary Passing by Reference and Value
!
Positional & Named Notation
!
Default Values & Parameter Constraints