You are on page 1of 63

Day-1

******

SQL> set serveroutput on


Example1:Displaying the output
BEGIN
dbms_output.put_line('Welcome to PLSQL');
END;
/
Output:
Welcome to PLSQL
Example2: Declaring the variables in Declare Section
Initialize the variables in begin (executable) section
SQL> DECLARE
v_name varchar2(10);
v_name1 char(10);
begin
v_name := 'SQL';
v_name1 := 'STAR';
dbms_output.put_line(v_name);
dbms_output.put_line(v_name1);
end;
Output:
SQL
STAR
SQL> DECLARE
v_name varchar2(10);
v_name1 char(10);
begin
v_name := 'SQL';
v_name1 := 'STAR';
dbms_output.put_line(v_name ||' ' || v_name1);
END;
/
Output:
SQL STAR
Example3: Declaring the variables in Declare Section
Initialize the variables in Declare Section

SQL> DECLARE
v_name varchar2(10) := 'star';
BEGIN
dbms_output.put_line(v_name);
END;
/
Output:
star
Example4: Declaring the varibles in declare section
Initialize the variables in declare section
To prove a variable by default contains a null value
SQL> DECLARE
v_name varchar2(10) := 'star';
v_name1 varchar2(10);
BEGIN
dbms_output.put_line(v_name);
dbms_output.put_line('*****');
dbms_output.put_line(v_name1);
dbms_output.put_line('*****');
END;
/
Output:
star
*****
*****
Example5: Declaring the variables with different datatypes & initalizing
SQL> DECLARE
v_name varchar2(10) := 'star';
v_sal number(5) := 50000;
v_date date := sysdate;
BEGIN
dbms_output.put_line(v_name);
dbms_output.put_line(v_sal);
dbms_output.put_line(v_date);
END;
/
Output:
star
50000
12-MAY-10
Example6: Overwritting the existing variable value
SQL> DECLARE
v_name varchar2(10) := 'STAR';
BEGIN
dbms_output.put_line(v_name);
dbms_output.put_line('After Manipulation');
v_name := 'Super Star';
dbms_output.put_line(v_name);
END;
/
Output:
STAR
After Manipulation
Super Star
Example7: Defining the NOT NULL constraint with the Variable
SQL> declare
v_name varchar2(10) NOT NULL := 'star';
begin
dbms_output.put_line(v_name);
end;
/
Output:
star

Example8: Defining the CONSTANT constraint with the Variable


SQL> DECLARE
v_interest constant number(5,2) := 10.25;
BEGIN
dbms_output.put_line(v_interest);
END;
/
Output:
10.25
Example9: Defining the DEFAULT value with the Variable
SQL> DECLARE
v_name varchar2(10) DEFAULT 'star';
BEGIN
dbms_output.put_line(v_name);
END;
/
Output:
star
Example10
Using the pipe symbol while displaying the output
SQL> DECLARE
v_name varchar2(10) := 'Prabhas';
BEGIN
dbms_output.put_line('Rebel Star' || v_name);
END;
/
Output:
Rebel StarPrabhas
Example10: Add +5 to the sysdate variable
Note:
Never enclose function or variable name
in single quotes in printing output
SQL> DECLARE
v_date DATE := sysdate + 5;
BEGIN
dbms_output.put_line(SYSDATE);
dbms_output.put_line(v_date);
END;
/
Output:
12-MAY-10
17-MAY-10

Example11: Defining one varaible with PLSQL SELECT Statement


SQL> DECLARE
v_sal number(5);
BEGIN
SELECT salary INTO v_sal
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal);
END;
/
Output:
18000
Example12: Define two variables & displaying on differnt lines
SELECT Statement
SQL> DECLARE
v_sal number(5);
v_name varchar2(10);
BEGIN
SELECT salary,last_name INTO v_sal,v_name
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal);
dbms_output.put_line(v_name);
END;
/
Output:
18000
Kochhar
Example13: Definin two variables & displaying on same line
by using SELECT Statement
SQL> DECLARE
v_sal number(5);
v_name varchar2(10);
BEGIN
SELECT salary,last_name INTO v_sal,v_name
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal || ',' || v_name);
END;
/
Output:
18000,Kochhar
Example14: Importance of %TYPE
SQL> DECLARE
v_sal number(3);
BEGIN
SELECT salary INTO v_sal
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal);
END;
/
Output:
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 4
SQL> DECLARE
v_sal DATE;
BEGIN
SELECT salary INTO v_sal
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal);
END;
/
Output:
SELECT salary INTO v_sal
*
ERROR at line 4:
ORA-06550: line 4, column 8:
PL/SQL: ORA-00932: inconsistent datatypes: expected DATE got NUMBER
ORA-06550: line 4, column 1:
PL/SQL: SQL Statement ignored
Solution by Using %TYPE
SQL> DECLARE
v_sal employees.salary%type;
BEGIN
SELECT salary INTO v_sal
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal);
END;
/
Output:
18000
Example15: NON PL/SQL VARIABLES or HOST VARIABLES or BIND VARIABLES
SQL> variable v_sal number
SQL> BEGIN
SELECT salary INTO :v_sal
FROM employees
WHERE employee_id=101;
END;
/
Output:
SQL> print :v_sal
V_SAL
----------
18000
Example16: Substitution Variable (&)
SQL> DECLARE
v_sal number(5);
BEGIN
SELECT salary INTO v_sal
FROM employees
WHERE employee_id=&no;
dbms_output.put_line(v_sal);
END;
/
Output:
Enter value for no: 101
old 6: WHERE employee_id=&no;
new 6: WHERE employee_id=101;
18000
Example17: DEFINE command
SQL> DEFINE no=101
SQL> DECLARE
v_sal number(5);
BEGIN
SELECT salary INTO v_sal
FROM employees
WHERE employee_id=&no;
dbms_output.put_line(v_sal);
END;
/
Output:
old 6: WHERE employee_id=&no;
new 6: WHERE employee_id=101;
18000

________________________________________________________________________________
_______________________________________
Day-2
********
SQL> SET SERVEROUTPUT ON
Example1: Single Line Comment
DECLARE
v_name varchar2(10) := 'sai';
-- It is a Scalar Variable
BEGIN
dbms_output.put_line(v_name);
END;
/
Output:
sai
Example2: Multiple Line Commenting
DECLARE
v_name varchar2(10) := 'sai';
/* It is
a Scalar Variable */
BEGIN
dbms_output.put_line(v_name);
END;
/
Output:
sai
Example3: Using Single Row Functions
DECLARE
v_name varchar2(10) := 'sai';
v_len number(4) := length(v_name);
v_cap varchar2(10) := UPPER(v_name);
BEGIN
dbms_output.put_line(v_name);
dbms_output.put_line(v_len);
dbms_output.put_line(v_cap);
END;
/
Output:
sai
3
SAI
Example 4: Nested Blocks (Block with in a block)
DECLARE
v_outer varchar2(20) := 'Outer Block';
BEGIN
DECLARE
v_inner varchar2(20) := 'Inner Block';
BEGIN
dbms_output.put_line(v_inner);
END;
dbms_output.put_line(v_outer);
END;
/
Output:
Inner Block
Outer Block
Example 5: Nested Block : Scope of Variables
Calling outer block variable in inner block
DECLARE
v_outer varchar2(20) := 'Outer Block';
BEGIN
DECLARE
v_inner varchar2(20) := 'Inner Block';
BEGIN
dbms_output.put_line(v_inner);
dbms_output.put_line('*********Printing Outer Block value');
dbms_output.put_line(v_outer);
END;
dbms_output.put_line(v_outer);
--dbms_output.put_line(v_inner);
END;
/
Output:
Inner Block
*********Printing Outer Block value
Outer Block
Outer Block
Example 6: Labels
<<label>>
DECLARE
v_outer varchar2(20) := 'Outer Block';
BEGIN
DECLARE
v_inner varchar2(20) := 'Inner Block';
v_outer varchar2(30) := 'Inner has Outer Block';
BEGIN
dbms_output.put_line(v_inner);
dbms_output.put_line('*********Printing Outer Block value');
dbms_output.put_line(label.v_outer);
dbms_output.put_line('*********Printing Inner Block value');
dbms_output.put_line(v_outer);
END;
dbms_output.put_line(v_outer);
END;
/
Output:
Inner Block
*********Printing Outer Block value
Outer Block
*********Printing Inner Block value
Inner has Outer Block
Outer Block
Example 7: INTO Clause
DECLARE
v_fullname varchar2(20);
BEGIN
SELECT first_name||last_name
INTO v_fullname
FROM employees
WHERE employee_id=101;
dbms_output.put_line('The fullname is ' || ' ' || v_fullname);
END;
/
Output:
The fullname is NeenaKochhar
Example 8: Using %TYPE
DECLARE
v_name employees.first_name%type;
v_sal employees.salary%type;
BEGIN
SELECT first_name,salary
INTO v_name,v_sal
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_name);
dbms_output.put_line(v_sal);
END;
/
Output:
Neena
17000
Example 9: Using Group Functions
DECLARE
v_sal number(5);
BEGIN
SELECT MAX(salary)
INTO v_sal
from employees;
dbms_output.put_line(v_sal);
END;
/
Output:
24000
DROP TABLE demo PURGE;
CREATE TABLE demo
(
empno number(4),
ename varchar2(10),
sal number(5)
);
Example 10: DML Insert
DECLARE
v_no number(4) := 1;
v_name varchar2(10) := 'sai';
v_sal number(5) := 50000;
BEGIN
insert into demo values (v_no,v_name,v_sal);
dbms_output.put_line(SQL%ROWCOUNT);
commit;
END;
/
Output:
1
Example 11: DML Update
DECLARE
v_no number(4) := 1;
v_sal number(5) := 60000;
BEGIN
update demo set sal=v_sal where empno=v_no;
dbms_output.put_line(SQL%ROWCOUNT);
commit;
END;
/
Output:
1
Example 12: DML Delete
BEGIN
delete demo;
dbms_output.put_line(SQL%ROWCOUNT);
commit;
END;
/
Example 13: DML Merge
DROP TABLE copy_emp;
CREATE TABLE copy_emp AS (SELECT * FROM employees WHERE 1= 2);
CREATE TABLE emp_demo AS SELECT * FROM employees;
-- Insert one row into the copy_emp table and update its value.
-- This helps in observing that the MERGE worked successfully.
INSERT INTO COPY_EMP (SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 100);
SELECT * FROM COPY_EMP;
UPDATE COPY_EMP SET LAST_NAME='VALLI' WHERE employee_id =100;
SELECT * FROM copy_emp WHERE employee_id = 100;
SELECT * FROM emp_demo WHERE employee_id = 100;
-- PL/SQL block that contains the MERGE statement
DECLARE
empno employees.employee_id%TYPE := 100;
BEGIN
MERGE INTO copy_emp c
USING emp_demo e
ON (e.employee_id = c.employee_id)
WHEN MATCHED THEN
UPDATE SET
c.first_name = e.first_name,
c.last_name = e.last_name,
c.email = e.email,
c.phone_number = e.phone_number,
c.hire_date = e.hire_date,
c.job_id = e.job_id,
c.salary = e.salary,
c.commission_pct = e.commission_pct,
c.manager_id = e.manager_id,
c.department_id = e.department_id
WHEN NOT MATCHED THEN
INSERT VALUES(e.employee_id, e.first_name, e.last_name,e.email,
e.phone_number, e.hire_date, e.job_id,e.salary,
e.commission_pct, e.manager_id,
e.department_id);
END;
/
-- Observe that the MERGE is successful
SELECT COUNT(*) FROM copy_emp;
SELECT * FROM copy_emp WHERE employee_id = 100;
SELECT * FROM emp_demo WHERE employee_id = 100;

________________________________________________________________________________
__________________________________________
Day-3
********

SET SERVEROUTPUT ON
Prog1:
Simple IF Statement
DECLARE
myage number:=31;
BEGIN
IF myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
END IF;
END;
**********************************************
Output:
PL/SQL procedure successfully completed.
**********************************************
Prog2:
Simple IF Statement
DECLARE
v_num1 NUMBER := 5;
v_num2 NUMBER := 3;
v_temp NUMBER;
BEGIN
-- if v_num1 is greater than v_num2 rearrange their values
DBMS_OUTPUT.PUT_LINE ('***Before Interchanging****');
DBMS_OUTPUT.PUT_LINE ('v_num1 = '|| v_num1);
DBMS_OUTPUT.PUT_LINE ('v_num2 = '|| v_num2);
IF v_num1 > v_num2 THEN
v_temp := v_num1;
v_num1 := v_num2;
v_num2 := v_temp;
END IF;
-- display the values of v_num1 and v_num2
DBMS_OUTPUT.PUT_LINE ('***After Interchanging****');
DBMS_OUTPUT.PUT_LINE ('v_num1 = '||v_num1);
DBMS_OUTPUT.PUT_LINE ('v_num2 = '||v_num2);
END;
**********************************************
Output:
***Before Interchanging****
v_num1 = 5
v_num2 = 3
***After Interchanging****
v_num1 = 3
v_num2 = 5
**********************************************
Prog3:
IF THEN ELSE Statement
DECLARE
myage number:=31;
BEGIN
IF myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am not a child ');
END IF;
END;
**********************************************
Output:
I am not a child
**********************************************
Prog4:
IF THEN ELSE Statement
DECLARE
v_num NUMBER := &no;
BEGIN
-- test if the number provided by the user is even
IF MOD(v_num,2) = 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is even number');
ELSE
DBMS_OUTPUT.PUT_LINE (v_num||' is odd number');
END IF;
DBMS_OUTPUT.PUT_LINE ('Done');
END;
**********************************************
Output:
10 is even number
Done
**********************************************
Prog5:
NULL CONDITION
DECLARE
v_num1 NUMBER := 0;
v_num2 NUMBER;
BEGIN
IF v_num1 = v_num2 THEN
DBMS_OUTPUT.PUT_LINE ('v_num1 = v_num2');
ELSE
DBMS_OUTPUT.PUT_LINE ('v_num1 != v_num2');
END IF;
END;
**********************************************
Output:
v_num1 != v_num2
**********************************************
Prog6:
ELSIF statement
DECLARE
v_num NUMBER := &sv_num;
BEGIN
IF v_num < 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is a negative number');
ELSIF v_num = 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is equal to zero');
ELSE
DBMS_OUTPUT.PUT_LINE (v_num||' is a positive number');
END IF;
END;
**********************************************
Output:
10 is a positive number
**********************************************
Prog7:
DECLARE
v_num NUMBER := &sv_num;
BEGIN
IF v_num < 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is a negative number');
ELSIF v_num > 0 THEN
DBMS_OUTPUT.PUT_LINE (v_num||' is a positive number');
END IF;
DBMS_OUTPUT.PUT_LINE ('Done...');
END;
**********************************************
Output:
-1 is a negative number
Done...
**********************************************
Prog8:
NESTED IF statement
DECLARE
v_num1 NUMBER := &sv_num1;
v_num2 NUMBER := &sv_num2;
v_total NUMBER;
BEGIN
IF v_num1 > v_num2 THEN
DBMS_OUTPUT.PUT_LINE ('IF part of the outer IF');
v_total := v_num1 - v_num2;
ELSE
DBMS_OUTPUT.PUT_LINE ('ELSE part of the outer IF');
v_total := v_num1 + v_num2;
IF v_total < 0 THEN
DBMS_OUTPUT.PUT_LINE ('Inner IF');
v_total := v_total * (-1);
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE ('v_total = '||v_total);
END;
**********************************************
Output:
Enter value for sv_num1: 10
Enter value for sv_num2: 20
ELSE part of the outer IF
v_total = 30
**********************************************
Prog9:
Logical Operators
DECLARE
v_letter CHAR(1) := '&sv_letter';
BEGIN
IF (v_letter >= 'A' AND v_letter <= 'Z') OR
(v_letter >= 'a' AND v_letter <= 'z')
THEN
DBMS_OUTPUT.PUT_LINE ('This is a letter');
ELSE
DBMS_OUTPUT.PUT_LINE ('This is not a letter');
IF v_letter BETWEEN '0' and '9' THEN
DBMS_OUTPUT.PUT_LINE ('This is a number');
ELSE
DBMS_OUTPUT.PUT_LINE ('This is not a number');
END IF;
END IF;
END;
**********************************************
Output:
Enter value for sv_letter: 1
This is not a letter
This is a number
Enter value for sv_letter: a
This is a letter
Enter value for sv_letter: %
This is not a letter
This is not a number
**********************************************
Prog10:
IF ELSIF ELSE Clause
DECLARE
myage number:=&no;
;
BEGIN
IF myage < 11
THEN
DBMS_OUTPUT.PUT_LINE(' I am a child ');
ELSIF myage < 20
THEN
DBMS_OUTPUT.PUT_LINE(' I am young ');
ELSIF myage < 30
THEN
DBMS_OUTPUT.PUT_LINE(' I am in my twenties');
ELSIF myage < 40
THEN
DBMS_OUTPUT.PUT_LINE(' I am in my thirties');
ELSE
DBMS_OUTPUT.PUT_LINE(' I am always young ');
END IF;
END;
**********************************************
Output:
I am in my thirties
**********************************************
Prog11:
CASE Expressions
DECLARE
grade CHAR(1) := UPPER('&grade');
appraisal VARCHAR2(20);
BEGIN
appraisal :=
CASE grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| grade || '
Appraisal ' || appraisal);
END;
**********************************************
Output:
Enter value for grade: c
Grade: C
Appraisal Good
**********************************************
Page12:
Searched CASE
DECLARE
grade CHAR(1) := UPPER('&grade');
appraisal VARCHAR2(20);
BEGIN
appraisal :=
CASE
WHEN grade = 'A' THEN 'Excellent'
WHEN grade IN ('B','C') THEN 'Good'
ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| grade || '
Appraisal ' || appraisal);
END;
**********************************************
Output:
Enter value for grade: a
Grade: A
Appraisal Excellent
**********************************************
LOOPS
Syntax:
LOOP
statement1;
...
EXIT [WHEN condition];
END LOOP;
Prog13:
BASIC Loop
DECLARE
v_name varchar2(10) := 'star';
v_c number(2) :=10;
v_counter number(2) := 5;
BEGIN
LOOP
dbms_output.put_line(v_name);
v_counter := v_counter +1;
exit when v_counter >4;
END LOOP;
END;

**********************************************
Output:
star
star
star
star
star
star
**********************************************
Prog14:
WHILE Loop
DECLARE
v_name varchar2(10) := 'star';
v_c number(2) :=10;
v_counter number(2) := 5;
BEGIN
WHILE v_counter <4 LOOP
dbms_output.put_line(v_name);
v_counter := v_counter +1;
END LOOP;
END;
**********************************************
Output:
star
star
star
star
star
**********************************************
Prog15:
FOR Loop
DECLARE
v_name varchar2(10) := 'star';
BEGIN
FOR I IN 1..5 LOOP
dbms_output.put_line(v_name);
END LOOP;
END;
**********************************************
Output:
star
star
star
star
star
**********************************************
Prog16:
FOR Loop with reverse option
BEGIN
FOR I IN REVERSE 1..5 LOOP
dbms_output.put_line(I);
END LOOP;
END;
**********************************************
Output:
5
4
3
2
1
Prog17:
PL/SQL Record
DECLARE
TYPE emp_rec IS RECORD
(
v_name VARCHAR2(10),
v_date DATE
);
v_rec emp_rec;
BEGIN
SELECT last_name,hire_date
INTO v_rec
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_rec.v_name);
dbms_output.put_line(v_rec.v_date);
END;
**********************************************
Output:
Kochhar
21-SEP-89
**********************************************
PROG18:
%ROWTYPE
DECLARE
emp_rec employees%ROWTYPE;
BEGIN
SELECT *
INTO emp_rec
FROM employees
WHERE employee_id=101;
dbms_output.put_line(emp_rec.last_name);
dbms_output.put_line(emp_rec.salary);
END;
**********************************************
Output:
Kochhar
18000
**********************************************
CREATE TABLE EMP1
AS SELECT * FROM EMPLOYEES WHERE 1=2;
**********************************************
Output:
Table created.
**********************************************
SELECT COUNT(*) FROM emp1;
**********************************************
Output:
COUNT(*)
----------
0
**********************************************
PROG19:
%ROWTYPE with INSERT
DECLARE
emp_rec employees%rowtype;
BEGIN
SELECT * INTO emp_rec
FROM employees
WHERE employee_id=101;
INSERT INTO emp1 values emp_rec;
COMMIT;
END;
**********************************************
Output:
PL/SQL procedure successfully completed.
**********************************************
SQL> select count(*) from emp1;
**********************************************
Output:
COUNT(*)
--------
1
**********************************************
Prog20:
INDEX BY TABLE with %TYPE storing a single row value
DECLARE
TYPE emp_tab IS TABLE OF
employees.last_name%type
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT last_name INTO v_emp(1)
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_emp(1));
END;
**********************************************
Output:
Kochhar
**********************************************
Prog21:
INDEX BY TABLE with %TYPE storing multiple row values
DECLARE
TYPE emp_tab IS TABLE OF
emp.last_name%type
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT last_name INTO v_emp(1)
FROM employees
WHERE employee_id=101;
SELECT last_name INTO v_emp(1)
FROM employees
WHERE employee_id=102;
dbms_output.put_line(v_emp(1));
dbms_output.put_line(v_emp(2));
END;
**********************************************
Output:
Kochhar
De Haan
**********************************************
Prog22:
INDEX BY TABLE with %ROWTYPE with multiple row values
DECLARE
TYPE emp_tab IS TABLE OF
employees%rowtype
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT * INTO v_emp(1)
FROM employees
WHERE employee_id=101;
SELECT * INTO v_emp(2)
FROM employees
WHERE employee_id=102;
dbms_output.put_line(v_emp(1).last_name || ' job ' || v_emp(1).job_id);
dbms_output.put_line(v_emp(2).last_name || ' job ' || v_emp(2).job_id);
END;
**********************************************
Output:
Kochhar job AD_VP
De Haan job AD_VP
**********************************************
Prog23:
INDEX BY TABLE with EXISTS
DECLARE
TYPE emp_tab IS TABLE OF
employees%rowtype
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT * INTO v_emp(1)
FROM employees
WHERE employee_id=101;
IF v_emp.EXISTS(1) THEN
dbms_output.put_line(v_emp(1).last_name || ' job ' || v_emp(1).job_id);
ELSE
dbms_output.put_line('No value existing at primary key value 1');
END IF;
END;
**********************************************
Output:
Kochhar job AD_VP
***********************************************
Prog24:
INDEX BY TABLE with COUNT
DECLARE
TYPE emp_tab IS TABLE OF
employees%rowtype
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT * INTO v_emp(1)
FROM employees
WHERE employee_id=101;
SELECT * INTO v_emp(2)
FROM employees
WHERE employee_id=102;
dbms_output.put_line(' counting ' || v_emp.count);
dbms_output.put_line(v_emp(1).last_name || ' job ' || v_emp(1).job_id);
dbms_output.put_line(v_emp(2).last_name || ' job ' || v_emp(2).job_id);
END;
**********************************************
Output:
counting 2
Kochhar job AD_VP
De Haan job AD_VP
***********************************************

Prog25:
INDEX BY TABLE with PRIOR
DECLARE
TYPE emp_tab IS TABLE OF
employees%rowtype
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT * INTO v_emp(1)
FROM employees
WHERE employee_id=101;
SELECT * INTO v_emp(2)
FROM employees
WHERE employee_id=102;
dbms_output.put_line(' prior ' || v_emp.prior(2));
dbms_output.put_line(v_emp(1).last_name || ' job ' || v_emp(1).job_id);
dbms_output.put_line(v_emp(2).last_name || ' job ' || v_emp(2).job_id);
END;
**********************************************
Output:
prior 1
Kochhar job AD_VP
De Haan job AD_VP
**********************************************

Prog26:
INDEX BY TABLE with NEXT
DECLARE
TYPE emp_tab IS TABLE OF
employees%rowtype
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
SELECT * INTO v_emp(1)
FROM employees
WHERE employee_id=101;
SELECT * INTO v_emp(2)
FROM employees
WHERE employee_id=102;
dbms_output.put_line(' Next ' || v_emp.next(1));
dbms_output.put_line(v_emp(1).last_name || ' job ' || v_emp(1).job_id);
dbms_output.put_line(v_emp(2).last_name || ' job ' || v_emp(2).job_id);
END;
**********************************************
Output:
Next 2
Kochhar job AD_VP
De Haan job AD_VP
**********************************************
Prog27:
INDEX BY TABLE with FIRST..LAST
DECLARE
TYPE emp_tab IS TABLE OF
employees%rowtype
INDEX BY PLS_INTEGER;
v_emp emp_tab;
BEGIN
FOR I in 100..104 LOOP
SELECT * INTO v_emp(I) FROM employees WHERE employee_id=I;
END LOOP;
FOR I IN v_emp.FIRST..v_emp.LAST LOOP
dbms_output.put_line(v_emp(i).first_name || ' last name is' || v_emp(i).last_nam
e);
END LOOP;
END;
**********************************************
Output:
Steven last name is King
Neena last name is Kochhar
Lex last name is De Haan
Alexander last name is Hunold
Bruce last name is Ernst
**********************************************
________________________________________________________________________________
___________________________________________
Day-4
********
SET SERVEROUTPUT ON
TOPIC: CURSORS
Prog1:
Sample Program
DECLARE
v_name VARCHAR2(10);
BEGIN
SELECT FIRST_NAME INTO v_name
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_name);
END;
*******************************************
Output:
Neena
*******************************************
Prog2:
Cursor Attrbute %NOTFOUND
DECLARE
v_name VARCHAR2(20);
CURSOR v_cur IS
SELECT first_name
FROM employees;
BEGIN
OPEN v_cur;
LOOP
FETCH v_cur INTO v_name;
dbms_output.put_line(v_name);
EXIT WHEN v_cur%NOTFOUND;
END LOOP;
CLOSE v_cur;
END;
*******************************************
Output:
Ellen
Sundar
Mozhe
David
Hermann
Shelli
....
....
Jennifer
Eleni
Eleni
*******************************************
Prog3:
Cursor Attrbute %FOUND
DECLARE
v_name VARCHAR2(20);
CURSOR v_cur IS
SELECT first_name
FROM employees;
BEGIN
OPEN v_cur;
LOOP
FETCH v_cur INTO v_name;
dbms_output.put_line(v_name);
EXIT WHEN v_cur%FOUND;
END LOOP;
CLOSE v_cur;
END;
*******************************************
Output:
Ellen
*******************************************
Prog4:
Cursor Attrbute %ROWCOUNT
DECLARE
v_name VARCHAR2(20);
CURSOR v_cur IS
SELECT first_name
FROM employees;
BEGIN
OPEN v_cur;
LOOP
dbms_output.put_line(v_name);
FETCH v_cur INTO v_name;
EXIT WHEN v_cur%ROWCOUNT>5;
END LOOP;
CLOSE v_cur;
END;
*******************************************
Output:
Ellen
Sundar
Mozhe
David
Hermann
*******************************************
Prog5:
CURSOR FOR LOOP
DECLARE
CURSOR v_cur IS SELECT * FROM employees;
BEGIN
FOR v_emp IN v_cur LOOP
dbms_output.put_line(v_emp.first_name);
END LOOP;
END;
*******************************************
Output:
Donald
Douglas
Jennifer
Michael
......
......
Samuel
Vance
Alana
Kevin
*******************************************
Prog6:
--DEFINE p_deptno = 10
DECLARE
deptno NUMBER := &p_deptno;
CURSOR emp_cursor IS
SELECT last_name, salary,manager_id
FROM employees
WHERE department_id = deptno;
BEGIN
FOR emp_record IN emp_cursor
LOOP
IF emp_record.salary < 5000 AND (emp_record.manager_id=101 OR emp_record.mana
ger_id=124) THEN
DBMS_OUTPUT.PUT_LINE (emp_record.last_name || ' Due for a raise');
ELSE
DBMS_OUTPUT.PUT_LINE (emp_record.last_name || ' Not Due for a raise');
END IF;
END LOOP;
END;
*******************************************
Output:
Whalen Due for a raise
*******************************************
Prog7:
CURSOR FOR LOOP WITH subquery
BEGIN
FOR v_emp IN (SELECT * FROM EMPLOYEES) LOOP
dbms_output.put_line(v_emp.first_name);
END LOOP;
END;
*******************************************
Output:
Donald
Douglas
Jennifer
Michael
......
......
Samuel
Vance
Alana
Kevin
*******************************************
Cursor with Parameter
Prog8:
DECLARE
CURSOR c1(p_deptno IN NUMBER, p_job IN VARCHAR2) IS
SELECT employee_id,last_name
FROM employees
WHERE department_id=p_deptno AND job_id=p_job;
v1 c1%rowtype;
BEGIN
OPEN c1(10,'AD_ASST');
LOOP
FETCH C1 INTO v1;
EXIT WHEN c1%notfound;
dbms_output.put_line('dept10 details ' || v1.last_name);
END LOOP;
CLOSE C1;
OPEN c1(20,'MK_MAN');
LOOP
FETCH C1 INTO v1;
EXIT WHEN c1%notfound;
dbms_output.put_line('dept20 details ' || v1.last_name);
END LOOP;
CLOSE C1;
END;
*******************************************
Output:
dept10 details Whalen
dept20 details Hartstein
******************************************
Prog10:
%ISOPEN
DECLARE
CURSOR c1(p_deptno IN NUMBER, p_job IN VARCHAR2) IS
SELECT employee_id,last_name
FROM employees
WHERE department_id=p_deptno AND job_id=p_job;
v1 c1%rowtype;
BEGIN
IF NOT C1%ISOPEN THEN
OPEN c1(10,'AD_ASST');
END IF;
LOOP
FETCH C1 INTO v1;
EXIT WHEN c1%notfound;
dbms_output.put_line('dept10 details ' || v1.last_name);
END LOOP;
CLOSE C1;
OPEN c1(20,'MK_MAN');
LOOP
FETCH C1 INTO v1;
EXIT WHEN c1%notfound;
dbms_output.put_line('dept20 details ' || v1.last_name);
END LOOP;
CLOSE C1;
END;
*******************************************
Output:
dept10 details Whalen
dept20 details Hartstein
******************************************
Prog9:
Cursors with FOR UPDATE OF, WHERE CURRENT OF
UPDATE employees
SET salary=5000
WHERE department_id=60;
DECLARE
CURSOR c1 IS
SELECT employee_id,salary
FROM employees
WHERE department_id=60
FOR UPDATE OF salary NOWAIT;
BEGIN
FOR emp_rec IN c1 LOOP
IF emp_rec.salary<5000 then
UPDATE employees
SET salary=3000
WHERE CURRENT OF c1;
END IF;
END LOOP;
END;

TOPIC:
Exceptions:
SELECT first_name FROM employees WHERE first_name='John';
*******************************************
Output:
FIRST_NAME
--------------------
John
John
John
*******************************************
Prog1:
Excpetion TOO_MANY_ROWS
DECLARE
v_name VARCHAR2(10);
BEGIN
SELECT first_name INTO v_name
FROM employees
WHERE first_name='John';
dbms_output.put_line(v_name);
END;
*******************************************************************
Output:
decLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 4
*******************************************************************
Prog2:
numeric or value error
DECLARE
v_name VARCHAR2(3);
BEGIN
SELECT last_name INTO v_name
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_name);
END;
******************************************************************************
Output:
decLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
******************************************************************************
Prog3:
Handling TOO_MANY_ROWS Exception
DECLARE
v_name VARCHAR2(10);
BEGIN
SELECT first_name INTO v_name
FROM employees
WHERE first_name='John';
dbms_output.put_line(v_name);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
dbms_output.put_line('Returning more than one row');
END;
*********************************
Output:
Returning more than one row
*********************************

Prog4:
Handling VALUE_ERROR Exception
DECLARE
v_name VARCHAR2(3);
BEGIN
SELECT last_name INTO v_name
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_name);
EXCEPTION
WHEN VALUE_ERROR THEN
dbms_output.put_line('Data type size is small');
END;
*********************************
Output:
Data type size is small
*********************************
Prog5:
Handling ZERO_DIVIDE Exception
DECLARE
v_sal NUMBER;
BEGIN
SELECT salary/0 INTO v_sal
FROM employees
WHERE employee_id=101;
dbms_output.put_line(v_sal);
EXCEPTION
WHEN ZERO_DIVIDE THEN
dbms_output.put_line('We cant divide by zero');
END;
*********************************
Output:
We cant divide by zero
*********************************
Prog6:
Handling NO_DATA_FOUND Exception
DECLARE
v_name VARCHAR2(10);
BEGIN
SELECT last_name INTO v_name
FROM employees
WHERE employee_id=1;
dbms_output.put_line(v_name);
EXCEPTION
WHEN VALUE_ERROR THEN
dbms_output.put_line('Data type size is small');
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Employee is not existing');
END;
********************************
Output:
Employee is not existing
********************************
DECLARE
v_name VARCHAR2(10);
BEGIN
SELECT last_name INTO v_name
FROM employees
WHERE employee_id=1;
dbms_output.put_line(v_name);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Some error');
END;
********************************
Output:
Some error
********************************
Prog6:
Non Predefined Exception
DECLARE
v_excep EXCEPTION;
PRAGMA EXCEPTION_INIT(v_excep,-6502);
v_name VARCHAR2(2);
BEGIN
SELECT last_name INTO v_name
FROM employees WHERE employee_id=101;
EXCEPTION
WHEN v_excep THEN
dbms_output.put_line('Check the Variable Size');
END;
*********************************
Output:
Check the Variable Size
*********************************

Prog7:
Tracking the Error Number, Error Message
DECLARE
v_name VARCHAR2(2);
v_err_num NUMBER;
v_err_mess VARCHAR2(250);
BEGIN
SELECT last_name INTO v_name
FROM employees WHERE employee_id=101;
EXCEPTION
WHEN OTHERS THEN
v_err_num := SQLCODE;
v_err_mess := SQLERRM;
dbms_output.put_line(v_err_num);
dbms_output.put_line(v_err_mess);
END;
*****************************************************************************
Output:
-6502
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
*****************************************************************************
Prog8:
User Defined Exception
DECLARE
v_excep EXCEPTION;
BEGIN
UPDATE employees
SET salary=8000
WHERE employee_id=1;
IF SQL%NOTFOUND THEN
RAISE v_excep;
END IF;
EXCEPTION
WHEN v_excep THEN
dbms_output.put_line('Explicitly Raised Exception');
END;
*********************************
Output:
Explicitly Raised Exception
*********************************
Prog9:
RAISE_APPLICATION_ERROR
BEGIN
UPDATE employees
SET salary=8000
WHERE employee_id=1;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20000,'Raising Error');
END IF;
END;
*********************************
Output:
begiN
*
ERROR at line 1:
ORA-20000: Raising Error
ORA-06512: at line 6
*********************************
Prog10:
CREATE TABLE MESSAGES
(
MESSAGE VARCHAR2(250)
);
*********************************
Output:
Table created.
*********************************
DELETE FROM MESSAGES;
*********************************
Output:
0 rows deleted.
*********************************
Prog10:
Handling Multiple Exceptions
DEFINE sal = 6000
DECLARE
ename employees.last_name%TYPE;
emp_sal employees.salary%TYPE := &sal;
BEGIN
SELECT last_name
INTO ename
FROM employees
WHERE salary = emp_sal;
INSERT INTO messages
VALUES (ename || ' - ' || emp_sal);
EXCEPTION
WHEN no_data_found THEN
INSERT INTO messages
VALUES ('No employee with a salary of '|| TO_CHAR(emp_sal));
WHEN too_many_rows THEN
INSERT INTO messages
VALUES ('More than one employee with a salary of '||
TO_CHAR(emp_sal));
WHEN others THEN
INSERT INTO messages
VALUES ('Some other error occurred.');
END;
SELECT * FROM messages;
*********************************
Output:
MESSAGE
-----------
Fay - 6000
*********************************
Prog11:
DECLARE
childrecord_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(childrecord_exists, -02292);
BEGIN
DBMS_OUTPUT.PUT_LINE(' Deleting department 40........');
delete from departments where department_id=40;
EXCEPTION
WHEN childrecord_exists THEN
DBMS_OUTPUT.PUT_LINE(' Cannot delete this department. There are employees in
this department (child records exist.) ');
END;
*********************************
Output:
Deleting department 40........
Cannot delete this department. There are employees in this department (child
records exist.)
________________________________________________________________________________
___________________________________________
Day-5
********
Procedure
Prog1:
Simple Procedure
CREATE OR REPLACE PROCEDURE p1
IS
BEGIN
dbms_output.put_line('Welcome to 1st Procedure');
END p1;
execute p1; or exec p1;
*****************************
Output:
Welcome to 1st Procedure
*****************************
Prog2:
Simple Procedure
CREATE PROCEDURE hello_again IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello World again');
END;
BEGIN
hello_again;
END;
*****************************
Output:
Hello World again
*****************************
Prog3:
Procedure with IN parameters (INSERT)
CREATE OR REPLACE PROCEDURE add_job (
jobid jobs.job_id%TYPE,
jobtitle jobs.job_title%TYPE) IS
BEGIN
INSERT INTO jobs (job_id, job_title)
VALUES (jobid, jobtitle);
COMMIT;
END add_job;
EXECUTE add_job ('IT_DBA', 'Database Administrator');
SELECT * FROM jobs WHERE job_id = 'IT_DBA';
***********************************************************************
Output:
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
IT_DBA Database Administrator
***********************************************************************
Prog4:
Procedure with IN parameters (UPDATE) with Exception Handling
CREATE OR REPLACE PROCEDURE upd_job(
jobid IN jobs.job_id%TYPE,
jobtitle IN jobs.job_title%TYPE) IS
BEGIN
UPDATE jobs
SET job_title = jobtitle
WHERE job_id = jobid;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20202, 'No job updated.');
END IF;
END upd_job;
EXECUTE upd_job ('IT_DBA', 'Data Administrator');
SELECT * FROM jobs WHERE job_id = 'IT_DBA';
SQL> SELECT * FROM jobs WHERE job_id = 'IT_DBA';
***********************************************************************
Output:
JOB_ID JOB_TITLE MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
IT_DBA Data Administrator
***********************************************************************
EXECUTE upd_job ('IT_WEB', 'Web Master');
BEGIN upd_job ('IT_WEB', 'Web Master'); END;
*
ERROR at line 1:
ORA-20202: No job updated.
ORA-06512: at "HR.UPD_JOB", line 17
ORA-06512: at line 1
Prog5:
Procedure with IN parameters (DELETE)
CREATE OR REPLACE PROCEDURE del_job (jobid jobs.job_id%TYPE) IS
BEGIN
DELETE FROM jobs
WHERE job_id = jobid;
IF SQL%NOTFOUND THEN
RAISE_APPLICATION_ERROR(-20203, 'No jobs deleted.');
END IF;
END DEL_JOB;
SELECT * FROM jobs WHERE job_id = 'IT_DBA';
EXECUTE del_job ('IT_DBA');
SELECT * FROM jobs WHERE job_id = 'IT_DBA';
***********************************************************************
Output:
no rows selected
***********************************************************************
EXECUTE del_job ('IT_WEB');
BEGIN del_job ('IT_WEB'); END;
*
ERROR at line 1:
ORA-20203: No jobs deleted.
ORA-06512: at "HR.DEL_JOB", line 11
ORA-06512: at line 1
Prog7:
Procedure with Cursors
CREATE OR REPLACE PROCEDURE P1
IS
CURSOR emp_cursor IS SELECT * FROM employees;
BEGIN
FOR emp_rec IN emp_cursor LOOP
dbms_output.put_line(emp_rec.employee_id);
END LOOP;
END;
exec p1;
***************
Output:
100
101
102
103
....
....
194
195
196
197
***************
Prog8:
Procedure with IN Parameter
CREATE OR REPLACE PROCEDURE P1
(P_NO IN NUMBER)
IS
v_name varchar2(10);
BEGIN
SELECT first_name INTO v_name
FROM employees
WHERE employee_id=P_NO;
dbms_output.put_line(v_name);
END;
exec p1(100);
***************
Output:
Steven
***************
Prog9:
Procedure with OUT Parameter (Use Bind variable for OUT Parameter)
CREATE OR REPLACE PROCEDURE p1
(P_NO IN NUMBER, P_JOB OUT VARCHAR2, P_SAL OUT NUMBER)
IS
BEGIN
SELECT job_id,salary
INTO P_JOB,P_SAL
FROM employees
WHERE employee_id=P_NO;
END p1;
Procedure Created
SQL> variable g_job varchar2(20)
SQL> variable g_sal varchar2(20)
SQL> exec p1(100,:g_job,:g_sal);
SQL> print g_job g_sal
************************
Output:
G_JOB G_SAL
-------------------
AD_PRES 24000
************************
Prog10:
Procedure with OUT Parameter (Use Bind variable for OUT Parameter)
With Exception
CREATE OR REPLACE PROCEDURE p1
(P_NO IN NUMBER, P_JOB OUT VARCHAR2, P_SAL OUT NUMBER)
IS
BEGIN
SELECT job_id,salary
INTO P_JOB,P_SAL
FROM employees
WHERE employee_id=P_NO;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Check the Parameter Value');
END p1;
variable g_job varchar2(20)
variable g_sal varchar2(20)
exec p1(10,:g_job,:g_sal);
exec p1(
****************************
Output:
Check the Parameter Value
****************************
CREATE TABLE T1
(JOB VARCHAR2(10),
SAL NUMBER(5)
);
CREATE OR REPLACE PROCEDURE p1
(P_JOB IN VARCHAR2 DEFAULT 'AD_PRES', P_SAL IN NUMBER DEFAULT 18000)
IS
BEGIN
INSERT INTO T1 VALUES (P_JOB,P_SAL);
COMMIT;
END p1;
SQL> exec p1;
PL/SQL procedure successfully completed.
SQL> select * from t1;
JOB SAL
---------- ----------
AD_PRES 18000
SQL> exec p1 ('Web',p_sal=>5000);
PL/SQL procedure successfully completed.
SQL> select * from t1;
JOB SAL
---------- ----------
AD_PRES 18000
Web 5000
SQL> exec p1 (p_sal=>5000,p_job=>'Web');
PL/SQL procedure successfully completed.
SQL> select * from t1;
JOB SAL
---------- ----------
AD_PRES 18000
Web 5000
Web 5000

CREATE OR REPLACE PROCEDURE format_phone


(phone_no IN OUT VARCHAR2) IS
BEGIN
phone_no := '(' || SUBSTR(phone_no,1,3) ||
')' || SUBSTR(phone_no,4,3) ||
'-' || SUBSTR(phone_no,7);
END format_phone;
variable g_phone varchar2(25);
begin
:g_phone := '07983649063';
end;
print g_phone;
G_PHONE
--------------------------------
(079)836-49063
*********************
Exception Handling:
*********************
CREATE OR REPLACE PROCEDURE PROC2
IS
v_name EMPLOYEES.LAST_NAME%TYPE;
BEGIN
SELECT last_name INTO v_name FROM employees WHERE employee_id=1;
END PROC2;
/
Output:
Procedure created.
CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Welcome');
PROC2;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Data is not existing');
END PROC1;
/
Output:
Procedure created.
SQL> EXEC PROC1
Welcome
Data is not existing
PL/SQL procedure successfully completed.
--------------------------------------------------------------------------------
-------------
CREATE OR REPLACE PROCEDURE PROC2
IS
v_name EMPLOYEES.LAST_NAME%TYPE;
BEGIN
SELECT last_name INTO v_name FROM employees WHERE employee_id=1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Handling: PROC2 : Data is not existing');
END PROC2;
/
Output:
Procedure created.
CREATE OR REPLACE PROCEDURE PROC1
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Welcome');
PROC2;
END PROC1;
/
Output:
Procedure created.
SQL> EXEC PROC1
Welcome
Data is not existing
PL/SQL procedure successfully completed.
Functions:
Prog1:
Simple Function
CREATE OR REPLACE FUNCTION get_job (jobid IN jobs.job_id%type)
RETURN jobs.job_title%type IS
title jobs.job_title%type;
BEGIN
SELECT job_title
INTO title
FROM jobs
WHERE job_id = jobid;
RETURN title;
END get_job;
VARIABLE title VARCHAR2(35)
EXECUTE :title := get_job ('SA_REP');
PRINT title
*********************************************************
Output:
TITLE
--------------------------------
Sales Representative
*********************************************************
Prog2:
Simple Function with Calculation
CREATE OR REPLACE FUNCTION TAX (P_SAL IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN P_SAL*0.05;
END tax;
Function Created
SQL> select employee_id,salary,tax(salary) from employees
where employee_id=101;
EMPLOYEE_ID SALARY TAX(SALARY)
----------- ---------- -----------
101 17000 850
DECLARE
v_tax number := TAX(1000);
BEGIN
dbms_output.put_line(v_tax);
END;
****************************
Output:
50
****************************
Prog3:
Complex Function with Calculation
CREATE OR REPLACE FUNCTION get_annual_comp(
sal IN employees.salary%TYPE,
comm IN employees.commission_pct%TYPE)
RETURN NUMBER IS
BEGIN
RETURN (NVL(sal,0) * 12 + (NVL(comm,0) * nvl(sal,0) * 12));
END get_annual_comp;
SELECT employee_id, last_name,
get_annual_comp(salary,commission_pct) "Annual Compensation"
FROM employees
WHERE department_id=30;
**************************************************************
Output:
EMPLOYEE_ID LAST_NAME Annual Compensation
----------- ------------------------- -------------------
114 Raphaely 132000
115 Khoo 37200
116 Baida 34800
117 Tobias 33600
118 Himuro 31200
119 Colmenares 30000
6 rows selected.
****************************************************************
Prog4:
CREATE OR REPLACE FUNCTION valid_deptid(
deptid IN departments.department_id%TYPE)
RETURN BOOLEAN IS
dummy PLS_INTEGER;
BEGIN
SELECT 1
INTO dummy
FROM departments
WHERE department_id = deptid;
RETURN TRUE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN FALSE;
END valid_deptid;
CREATE OR REPLACE PROCEDURE add_employee(
first_name employees.first_name%TYPE,
last_name employees.last_name%TYPE,
email employees.email%TYPE,
job employees.job_id%TYPE DEFAULT 'SA_REP',
mgr employees.manager_id%TYPE DEFAULT 145,
sal employees.salary%TYPE DEFAULT 1000,
comm employees.commission_pct%TYPE DEFAULT 0,
deptid employees.department_id%TYPE DEFAULT 30) IS
BEGIN
IF valid_deptid(deptid) THEN
INSERT INTO employees(employee_id, first_name, last_name, email,
job_id, manager_id, hire_date, salary, commission_pct, department_id)
VALUES (employees_seq.NEXTVAL, first_name, last_name, email,
job, mgr, TRUNC(SYSDATE), sal, comm, deptid);
ELSE
RAISE_APPLICATION_ERROR (-20204, 'Invalid department ID. Try again.');
END IF;
END add_employee;
EXECUTE add_employee('Jane', 'Harris', 'JAHARRIS', deptid=> 15);

SQL> EXECUTE add_employee('Jane', 'Harris', 'JAHARRIS', deptid=> 15);


***********************************************************************
Output:
BEGIN add_employee('Jane', 'Harris', 'JAHARRIS', deptid=> 15); END;
*
ERROR at line 1:
ORA-20204: Invalid department ID. Try again.
ORA-06512: at "HR.ADD_EMPLOYEE", line 33
ORA-06512: at line 1
***********************************************************************
EXECUTE add_employee('Joe', 'Harris', 'JAHARRIS', deptid=> 80);
Prog5:
Function by using Group Function
CREATE FUNCTION total_salary RETURN NUMBER IS
total employees.salary%type;
BEGIN
SELECT SUM(salary) INTO total
FROM employees;
RETURN total;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('Total Salary: '|| total_salary);
END;
****************************
Output:
Total Salary: 677600
****************************
OR
DECLARE
total number := total_salary;
BEGIN
DBMS_OUTPUT.PUT_LINE('Total Salary: '|| total);
END;
****************************
Output:
Total Salary: 677600
****************************
OR
EXECUTE DBMS_OUTPUT.PUT_LINE('Total Salary: '|| total_salary);
****************************
Output:
Total Salary: 677600
****************************
Example:1 Creating a Package Specification
CREATE OR REPLACE PACKAGE comm_pkg
IS
std_comm NUMBER := 0.10;
PROCEDURE reset_comm (new_comm IN NUMBER);
END comm_pkg;
/
Example:2 Creating a Package Body
CREATE OR REPLACE PACKAGE BODY comm_pkg
IS
FUNCTION validate(comm IN NUMBER)
RETURN BOOLEAN
IS
max_comm employees.commission_pct%type;
BEGIN
SELECT max(commission_pct)
INTO max_comm
FROM employees;
RETURN (comm BETWEEN 0.0 AND max_comm);
END validate;
PROCEDURE reset_comm (new_comm NUMBER)
IS
BEGIN
IF validate(new_comm) THEN
std_comm := new_comm;
ELSE
RAISE_APPLICATION_ERROR(-20000,'Invalid Commission');
END IF;
END reset_comm;
END comm_pkg;
/
Example:3 Executing a Pakcage
EXECUTE comm_pkg.reset_comm(0.15);
EXECUTE comm_pkg.reset_comm(15);
Example:4 Creating & Using Bodyless Package
CREATE OR REPLACE PACKAGE global_consts
IS
mile_2_kilo CONSTANT NUMBER := 1.6093;
kilo_2_mile CONSTANT NUMBER := 0.6214;
yard_2_meter CONSTANT NUMBER := 0.9144;
meter_2_yard CONSTANT NUMBER := 1.0936;
END global_consts;
/
Example:5 Calling package from anoether package
BEGIN
DBMS_OUTPUT.PUT_LINE('20 miles = ' ||20 * global_consts.mile_2_kilo || 'km');
END;
Example:6 Calling Package from the Fucntion
CREATE FUNCTION mtr2yrd(m NUMBER) RETURN NUMBER IS
BEGIN
RETURN (m * global_consts.meter_2_yard);
END mtr2yrd;
/
EXECUTE DBMS_OUTPUT.PUT_LINE(mtr2yrd(1));
Example:7 Removing Packages
DROP PACKAGE package_name;
DROP PACKAGE BODY package_name;
Example:8 Package Overloading
CREATE OR REPLACE PACKAGE dept_pkg IS
PROCEDURE add_department(deptno NUMBER,name VARCHAR2 := 'unknown', loc NUMBER
:= 1700);
PROCEDURE add_department( name VARCHAR2 := 'unknown', loc NUMBER
:= 1700);
END dept_pkg;

CREATE OR REPLACE PACKAGE BODY dept_pkg IS


PROCEDURE add_department (deptno NUMBER,name VARCHAR2:='unknown', loc NUMBER:=
1700)
IS
BEGIN
INSERT INTO departments(department_id,department_name, location_id)
VALUES (deptno, name, loc);
dbms_output.put_line('success1');
END add_department;
PROCEDURE add_department (name VARCHAR2:='unknown', loc NUMBER:=1700) IS
BEGIN
INSERT INTO departments (department_id,department_name, location_id)
VALUES (departments_seq.NEXTVAL, name, loc);
dbms_output.put_line('success2');
END add_department;
END dept_pkg;
EXECUTE dept_pkg.add_department(300,'ANALYSING',1700);
EXECUTE dept_pkg.add_department('ANALYSING1',1700);

Example:9 Forward Declartion


CREATE OR REPLACE PACKAGE demo1
IS
procedure p1;
END demo1;
CREATE OR REPLACE PACKAGE BODY demo1
IS
PROCEDURE p2;
PROCEDURE p1
IS
BEGIN
dbms_output.put_line('Welcome to p1 procedure');
p2;
dbms_output.put_line('Control is going to p2 procedure');
dbms_output.put_line('Control has come here from p2 procedure');
END p1;
PROCEDURE p2
IS
BEGIN
dbms_output.put_line('Control came here from p1 procedure');
dbms_output.put_line('Welcome to p2 procedure');
dbms_output.put_line('Control is going back to p1 procedure');
END p2;
END demo1;
EXECUTE demo1.p1;
Example:10 Package Function
CREATE OR REPLACE PACKAGE taxes_pkg IS
FUNCTION tax (value IN NUMBER) RETURN NUMBER;
END taxes_pkg;

CREATE OR REPLACE PACKAGE BODY taxes_pkg IS


FUNCTION tax (value IN NUMBER) RETURN NUMBER IS
rate NUMBER := 0.08;
BEGIN
RETURN (value * rate);
END tax;
END taxes_pkg;

SELECT taxes_pkg.tax(salary), salary, last_name


FROM employees;
Note: PRAGMA SERIALLY_REUSABLE
Memory --> SGA,UGA
SGA --> To save memory, Globalized
UGA --> More memory required, Private to each user

Example:11 Packages with Cursors


CREATE OR REPLACE PACKAGE curs_pkg IS
PROCEDURE open;
FUNCTION next(n NUMBER := 1) RETURN BOOLEAN;
PROCEDURE close;
END curs_pkg;

CREATE OR REPLACE PACKAGE BODY curs_pkg IS


CURSOR c IS SELECT employee_id FROM employees;
PROCEDURE open IS
BEGIN
IF NOT c%ISOPEN THEN OPEN c; END IF;
END open;
FUNCTION next(n NUMBER := 1) RETURN BOOLEAN IS
emp_id employees.employee_id%TYPE;
BEGIN
FOR count IN 1 .. n LOOP
FETCH c INTO emp_id;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Id: ' ||(emp_id));
END LOOP;
RETURN c%FOUND;
END next;
PROCEDURE close IS BEGIN
IF c%ISOPEN THEN CLOSE c; END IF;
END close;
END curs_pkg;

SET SERVEROUTPUT ON
EXECUTE curs_pkg.open
DECLARE
more BOOLEAN := curs_pkg.next(3);
BEGIN
IF NOT more THEN
curs_pkg.close;
END IF;
END;

RUN -- repeats execution on the anonymous block


EXECUTE curs_pkg.close

Example:11 Packages with PL/SQL Tables


CREATE OR REPLACE PACKAGE emp_pkg IS
TYPE emp_table_type IS TABLE OF employees%ROWTYPE
INDEX BY BINARY_INTEGER;
PROCEDURE get_employees(emps OUT emp_table_type);
END emp_pkg;

CREATE OR REPLACE PACKAGE BODY emp_pkg IS


PROCEDURE get_employees(emps OUT emp_table_type) IS
i BINARY_INTEGER := 0;
BEGIN
FOR emp_record IN (SELECT * FROM employees)
LOOP
emps(i) := emp_record;
i:= i+1;
END LOOP;
END get_employees;
END emp_pkg;

DECLARE
employees emp_pkg.emp_table_type;
BEGIN
emp_pkg.get_employees(employees);
DBMS_OUTPUT.PUT_LINE('Emp 4: '||employees(4).last_name);
END;

Example:12 Wrapper
vi one.sql
CREATE OR REPLACE PROCEDURE P1
IS
BEGIN
dbms_output.put_line('Welcome');
END;
/
$ WRAP INAME=one.sql
--> It creates one file with one.plb

Dynamic SQL
Prog1:
Creating a Table
CREATE OR REPLACE PROCEDURE create_table(
table_name VARCHAR2, col_specs VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE '||table_name||
' (' || col_specs || ')';
END;
BEGIN
create_table('e1','empno number(4)');
END;
DESC E1;
Prog2:
Creating a Table by defining table statement in the variable
CREATE OR REPLACE PROCEDURE create_table(
table_name VARCHAR2, col_specs VARCHAR2) IS
v1 varchar2(300) := 'CREATE TABLE '||table_name|| '(' || col_specs || ')';
BEGIN
EXECUTE IMMEDIATE v1;
END;
BEGIN
create_table('e2','empno number(4)');
END;
Prog3: Deleting the rows from a table
SQL> insert into e1 select empno from scott.emp;
16 rows created.
SQL> commit;
Commit complete.
CREATE FUNCTION del_rows(table_name VARCHAR2)
RETURN NUMBER IS
BEGIN
EXECUTE IMMEDIATE 'DELETE FROM '||table_name;
RETURN SQL%ROWCOUNT;
END;

BEGIN
DBMS_OUTPUT.PUT_LINE(del_rows('E1')|| ' rows deleted.');
END;
Output: 16 Rows Deleted
CREATE FUNCTION get_emp(emp_id NUMBER)
RETURN employees%ROWTYPE IS
stmt VARCHAR2(200);
emprec employees%ROWTYPE;
BEGIN
stmt := 'SELECT * FROM employees ' ||
'WHERE employee_id = :id';
EXECUTE IMMEDIATE stmt INTO emprec USING emp_id;
RETURN emprec;
END;

DECLARE
emprec employees%ROWTYPE := get_emp(100);
BEGIN
dbms_output.put_line(emprec.last_name);
END;

SELECT DBMS_METADATA.GET_DEPENDENT_DDL(OBJECT_GRANT,'EMPLOYEES','HR')
FROM dual;

Example:1 Standardizing Exceptions


CREATE OR REPLACE PACKAGE error_pkg IS
fk_err EXCEPTION;
PRAGMA EXCEPTION_INIT(fk_err,-2292);
END error_pkg;
/
BEGIN
DELETE departments WHERE department_id=10;
EXCEPTION
WHEN error_pkg.fk_err THEN
dbms_output.put_line('Child Rows are Existing');
END;
/
Example:2 Standardizing Constants
CREATE OR REPLACE PACKAGE constant_pkg IS
c_min_sal CONSTANT NUMBER(3) := 900;
END constant_pkg;
/
BEGIN
UPDATE emp1
SET SALARY=10000
WHERE salary <= constant_pkg.c_min_sal;
END;
/
Example:3 Local Subprograms
CREATE OR REPLACE PROCEDURE employee_sal (P_NO NUMBER)
IS
v_emp employees%ROWTYPE;
FUNCTION tax(SALARY VARCHAR2)
RETURN NUMBER
IS
BEGIN
RETURN SALARY * 0.8625;
END tax;
BEGIN
SELECT * INTO v_emp
FROM employees WHERE employee_id=P_NO;
dbms_output.put_line('Tax:' || tax(v_emp.salary) );
END;
/
EXEC EMPLOYEE_SAL(100);
Topic : Definer's Rights
Example:
Scott user --> Created --> Procedure --> get_employees
Smith user --> executing --> Procedure --> get_employees
Then get_employees procedure executes with the privileges of the user SCOTT
Invokers Rights:
For example, if Scottâ s PL/SQL subprogram get_employees is invoked by Sarah, then th
e get_employees procedure runs with the privileges of the invoker Sarah
Note:
Sarah should have access on all the objects that the subprogram get_employees ac
cess
Example: AUTHID CURRENT_USER
SQL> CONN HR/HR;
CREATE OR REPLACE PROCEDURE P1
--AUTHID CURRENT_USER
IS
V_NAME varchar2(20);
BEGIN
dbms_output.put_line('Welcome');
SELECT FIRST_NAME INTO V_NAME
FROM employees
WHERE employee_id=101;
dbms_output.put_line(V_NAME);
END;
Procedure created.
SQL> GRANT EXECUTE ON P1 TO SCOTT;
Grant succeeded.
SQL> CONN SCOTT/TIGER;
Connected.
SQL> EXEC HR.P1;
PL/SQL procedure successfully completed.
SQL> SET SERVEROUTPUT ON
SQL> EXEC HR.P1;
Welcome
Neena
PL/SQL procedure successfully completed.

CREATE OR REPLACE PROCEDURE P1


AUTHID CURRENT_USER
IS
V_NAME varchar2(20);
BEGIN
dbms_output.put_line('Welcome');
SELECT FIRST_NAME INTO V_NAME
FROM employees
WHERE employee_id=101;
dbms_output.put_line(V_NAME);
END;
Procedure created.

Example: RETURNING clause


CREATE OR REPLACE PROCEDURE update_salary (P_EMPNO NUMBER)
IS
v_name employees.last_name%type;
v_sal employees.salary%type;
BEGIN
UPDATE employees
SET salary=3000
WHERE employee_id=p_empno
RETURNING last_name,salary INTO v_name,v_sal;
dbms_output.put_line(v_name || ' updated salary is '|| v_sal);
END update_salary;
/
Set timing on
BULK COLLECT
Executing sql statements in plsql programs causes a context switch between the p
lsql engine and the sql engine
Too many context switches may degrade performance dramatically. In order to redu
ce the number of these context switches we can use a feature named bulk binding
Bulk binding lets us to transfer rows between the sql engine and the plsql engin
e as collections
Bulk binding is available for select, insert, delete and update statements
Bulk collect is the bulk binding syntax for select statements
One of the things i usualLy come accross is that developers usually tend to use
cursor for loops to process data
They declare a cursor, open it, fetch from it row by row in a loop and process t
he row they fetch

create table t_all_objects as select * from user_objects;


begin
for i in 1..200 loop
insert into t_all_objects select * from user_objects;
end loop;
commit;
end;
/
select count(*) from t_all_objects;
begin
for i in 1..200 loop
insert into t_all_objects select * from user_objects;
end loop;
commit;
end;
/
select count(*) from t_all_objects;

DECLARE
cursor c1 is select object_name from t_all_objects;
rec1 c1%rowtype;
begin
open c1;
loop
fetch c1 into rec1;
exit when c1%notfound;
null;
end loop;
end;
/
DECLARE
cursor c1 is select object_name from t_all_objects;
type c1_type is table of c1%rowtype;
rec1 c1_type;
begin
open c1;
loop
fetch c1 bulk collect into rec1;
exit when c1%notfound;
null;
end loop;
end;
/
CREATE OR REPLACE PROCEDURE raise_salary
(PERCENT NUMBER)
IS
TYPE numlist IS TABLE OF NUMBER
INDEX BY BINARY_INTEGER;
id numlist;
BEGIN
id(1) := 100;
id(2) := 102;
id(3) := 104;
id(4) := 110;
FORALL i IN id.first..id.last
UPDATE employees
SET salary =(1+percent/100) * salary
WHERE manager_id=id(i);
END;
/
CREATE OR REPLACE PROCEDURE get_departments
(LOC NUMBER) IS
TYPE dept_tabtype IS
TABLE OF departments%rowtype;
depts dept_tabtype;
BEGIN
SELECT * BULK COLLECT INTO depts
FROM departments
WHERE location_id=LOC;
FOR I IN 1..depts.COUNT LOOP
dbms_output.put_line(depts(i).department_id || ' ' || depts(i).department_name);
END loop;
END;
/
Topic: NOCOPY hint
NOCOPY is a hint to the compiler about how you would like the PL/SQL engine to w
ork with the data structure being passed in as an OUT or IN OUT parameter
Formal parameter
The parameter defined in the parameter list and used in the program
Actual parameter
The actual expression or variable passed to the program when it is called
By reference
When an actual parameter is passed by reference, it means that a pointer to the
actual parameter is passed to the corresponding formal parameter. Both the actua
l and formal parameters then reference, or point to, the same location in memory
that holds the value of the parameter
By value
When an actual parameter is passed by value, the value of the actual parameter i
s copied into the corresponding formal parameter.
If the program then terminates without an exception, the formal parameter value
is copied back to the actual parameter.
If an error occurs, the changed values are not copied back to the actual paramet
er.
Parameter Mode
Passed by Value or Reference? (Default Behavior)
IN
By reference
OUT
By value
IN OUT
Syntax:
parameter_name [ IN | IN OUT | OUT | IN OUT NOCOPY | OUT NOCOPY ] parameter_data
type

EXTEND -- Appends instances to a collection


EXTEND has three forms, EXTEND, which adds one null instance
EXTEND(n) which adds "n" null instances and
EXTEND(n,m) which appends N copies of instance "m" to the collection
DECLARE
TYPE t_tab IS TABLE OF VARCHAR2(32767);
l_tab t_tab := t_tab();
l_start NUMBER;
PROCEDURE in_out (p_tab IN OUT t_tab) IS
BEGIN
NULL;
END;
PROCEDURE in_out_nocopy (p_tab IN OUT NOCOPY t_tab) IS
BEGIN
NULL;
END;
BEGIN
l_tab.extend;
l_tab(1) := '1234567890123456789012345678901234567890';
l_tab.extend(999999, 1); -- Copy element 1 into 2..1000000

-- Time normal IN OUT


l_start := DBMS_UTILITY.get_time;
in_out(l_tab);
DBMS_OUTPUT.put_line('IN OUT : ' ||
(DBMS_UTILITY.get_time - l_start));
-- Time IN OUT NOCOPY
l_start := DBMS_UTILITY.get_time;
in_out_nocopy(l_tab); -- pass IN OUT NOCOPY parameter
DBMS_OUTPUT.put_line('IN OUT NOCOPY: ' ||
(DBMS_UTILITY.get_time - l_start));
END;
/

Time stamp
In database 2 created the procedure p2 at 8:00 am
IN database 1 created the procedure p1 at 9:00 am and calling p2
Since procedure p2 compiled at 8:00 am this compilation time is stored in p2
Assume when p1 is executing it checkts the timestamp value
When modifications are done in p2 and compiled at 11:00 am
Now p1 is calling p2 at 12:00 pm it gives error
so p1 procedure should be compiled 2 times
1st time error
2nd time recompilation
Signature : Means it checks datatypes, modes

FORWARD DECLARATION EXAMPLE


----------------------------
CREATE OR REPLACE PACKAGE P1
IS
PROCEDURE proc1 (v_no1 IN NUMBER,v_no2 IN NUMBER,v_tot OUT NUMBER);
END P1;
CREATE OR REPLACE PACKAGE BODY P1
IS
PROCEDURE cal_rating(v_no1 IN NUMBER,v_no2 IN NUMBER,val OUT NUMBER);
PROCEDURE proc1 (v_no1 IN NUMBER,v_no2 IN NUMBER,v_tot OUT NUMBER)
IS
val number;
BEGIN
v_tot := v_no1 + v_no2;
dbms_output.put_line('Addition value is ' || v_tot);

cal_rating(v_no1,v_no2,val);
dbms_output.put_line(val);
END proc1;
PROCEDURE cal_rating(v_no1 IN NUMBER,v_no2 IN NUMBER,val OUT NUMBER)
is
begin
val:=v_no1-v_no2;
END cal_rating;
END;
/
PACKAGE INITIALIZATION VARIABLE EXAMPLE
----------------------------------------
CREATE OR REPLACE PACKAGE P1
IS
HRA NUMBER;
DA NUMBER;
TA NUMBER;
PF NUMBER;
NET NUMBER;
PROCEDURE CALC_SAL_PAYSLIP(SAL IN EMPLOYEES.SALARY%TYPE,NETSAL OUT NUMBER);
END;
/
CREATE OR REPLACE PACKAGE BODY P1
IS
PROCEDURE CALC_SAL_PAYSLIP(SAL EMPLOYEES.SALARY%TYPE,NETSAL OUT NUMBER)
IS
BEGIN
NETSAL:=(SAL*HRA)+(SAL*DA)+(SAL*TA)-(SAL*PF);
END;
BEGIN
HRA:=0.25;
DA:=0.15;
TA:=0.10;
PF:=0.05;
END P1;
/
EXECUTING THE ABOVE BLOCK
-------------------------
VARIABLE N NUMBER;
DECLARE
V_NO NUMBER;
CURSOR C1 IS SELECT * FROM EMPLOYEES;
BEGIN
FOR X IN C1
LOOP
SELECT SALARY INTO V_NO FROM EMPLOYEES
WHERE EMPLOYEE_ID=X.EMPLOYEE_ID;
P1.CALC_SAL_PAYSLIP(V_NO,:N);
DBMS_OUTPUT.PUT_LINE(X.EMPLOYEE_ID||' '||X.LAST_NAME||' '||X.SALARY||'
'||:N);
END LOOP;
END;
/
SERIALLY REUSABLE
------------------
create or replace package pack1
is
pragma SERIALLY_REUSABLE;
v1 number := 300;
end;
------------------------
begin
pack1.v1 := 100;
dbms_output.put_line(pack1.v1);
end;
----------------------------------
execute dbms_output.put_line(pack1.v1);

USING THE RUN COMMAND


---------------------
DECLARE
X NUMBER:=10;
BEGIN
DBMS_OUTPUT.PUT_LINE(X);
END;
/
RUN
- WHICH WILL RE-EXECUTE THE PREVIOUS ANONYMOUS BLOCK OR NAMED BLOCKS.

ORACLE SUPPLIED PACKAGE EXAMPLE


-------------------------------
DBMS_SQL
---------
DELETE USING DBMS_SQL
---------------------
CREATE OR REPLACE PROCEDURE delete_all_rows (p_tab_name IN VARCHAR2, p_rows_del
OUT NUMBER)
IS
cursor_name INTEGER;
BEGIN
cursor_name := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name, 'DELETE FROM '||p_tab_name,DBMS_SQL.NATIVE );
p_rows_del := DBMS_SQL.EXECUTE (cursor_name);
DBMS_SQL.CLOSE_CURSOR(cursor_name);
END;
/
VARIABLE deleted NUMBER
EXECUTE delete_all_rows('devemp', :deleted)
PRINT deleted
INSERT USING DBMS_SQL
---------------------
create or replace procedure INSERT1
(id TEST.id%type, vname TEST.name%type)
is
p_rows_ins number;
cursor_name integer;
begin
cursor_name:=DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name,'insert into TEST values('||id||','''||vname||''')'
,
DBMS_SQL.NATIVE);
p_rows_ins :=DBMS_SQL.EXECUTE(cursor_name);
DBMS_SQL.CLOSE_CURSOR(CURSOR_NAME);
END;
/
execute INSERT1(2,'ANITHA');
select * from TEST
DELETING ALL ROWS FROM A TABLE
------------------------------
CREATE OR REPLACE PROCEDURE pb_delete_all_rows
(p_tab_name IN VARCHAR2, p_rows_del OUT NUMBER)
IS
cursor_name INTEGER;
BEGIN
cursor_name := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(cursor_name, 'DELETE FROM ' || p_tab_name,
DBMS_SQL.NATIVE);
p_rows_del := DBMS_SQL.EXECUTE(cursor_name);
DBMS_SQL.CLOSE_CURSOR(cursor_name);
END pb_delete_all_rows;
/
DROPPING A TABLE USING DBMS_SQL
-------------------------------
create or replace procedure drop_table1
(p_tab_name in varchar2)
is
cursor_name integer;
begin
cursor_name := dbms_sql.open_cursor;
dbms_sql.parse(cursor_name, 'drop table '|| p_tab_name, dbms_sql.native);
dbms_sql.close_cursor(cursor_name);
end drop_table1;
/
CREATING AN ANONYMOUS BLOCK USING EXECUTE IMMEDIATE
---------------------------------------------------
BEGIN
EXECUTE IMMEDIATE('BEGIN DBMS_OUTPUT.PUT_LINE(''DEV''); END;');
END;
/
CREATING A TABLE USING EXECUTE IMMEDIATE
----------------------------------------
DECLARE
A VARCHAR2(50);
BEGIN
A:='CREATE TABLE TEST(COL1 NUMBER)';
EXECUTE IMMEDIATE A;
END;
/
INSERTING INTO TABLE USING EXECUTE IMMEDIATE
--------------------------------------------
VARIABLE X NUMBER
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO TEST VALUES(:X)' USING 100;
END;
/
SELECTING FROM TABLE USING EXECUTE IMMEDIATE
---------------------------------------------
DECLARE
X NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM TEST' INTO X;
DBMS_OUTPUT.PUT_LINE(X);
END;
/
DECLARE
emprec employees%ROWTYPE := get_emp(100);
BEGIN
DBMS_OUTPUT.PUT_LINE('Emp: '||emprec.last_name);
END;
/
CREATE FUNCTION get_emp(emp_id NUMBER)
RETURN employees%ROWTYPE IS
stmt VARCHAR2(200);
emprec employees%ROWTYPE;
BEGIN
stmt := 'SELECT * FROM employees ' ||
'WHERE employee_id = :id';
EXECUTE IMMEDIATE stmt INTO emprec USING emp_id;
RETURN emprec;
END;
/
REF-CURSORS
------------
variable ref1 refcursor
begin
open :ref1 for select * from emp;
end;
/
print ref1;
/
create or replace package pack1
is
type ref_type is ref cursor;
end;
/
create or replace package pack1
is
type ref_type is ref cursor return emp%rowtype;
end;
/
declare
ref1 pack1.ref_type;
rec1 emp%rowtype;
begin
open ref1 for select * from emp;
fetch ref1 into rec1;
dbms_output.put_line(rec1.ename);
close ref1;
end;
/
CREATE or replace PROCEDURE list_employees(deptid NUMBER) IS
TYPE emp_refcsr IS REF CURSOR;
emp_cv emp_refcsr;
emprec emp%ROWTYPE;
stmt varchar2(200) := 'SELECT * FROM emp';
BEGIN
IF deptid IS NULL THEN OPEN emp_cv FOR stmt;
ELSE
stmt := stmt || ' WHERE deptno = :id';
OPEN emp_cv FOR stmt USING deptid;
END IF;
LOOP
FETCH emp_cv INTO emprec;
EXIT WHEN emp_cv%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(emprec.deptno||
' ' ||emprec.ename);
END LOOP;
CLOSE emp_cv;
END;
DROPPING A TABLE USING EXECUTE IMMEDIATE
----------------------------------------
CREATE OR REPLACE PROCEDURE drop_table
(p_tab_name IN VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || p_tab_name;
DBMS_OUTPUT.PUT_LINE(p_tab_name || ' deleted');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(p_tab_name || ' does not exists');
END;
/
DELETE ROWS FROM TABLE USING EXECUTE IMMEDIATE
-----------------------------------------------
CREATE PROCEDURE del_row(p_table_name IN VARCHAR2, p_rows_deld OUT NUMBER
)
IS
BEGIN
EXECUTE IMMEDIATE 'delete from '||p_table_name;
p_rows_deld := SQL%ROWCOUNT;
END;
/
VARIABLE deleted NUMBER
EXECUTE del_row('devs',:deleted)
PRINT deleted
QUERYING A TABLE USING EXECUTE IMMEDIATE
----------------------------------------
DECLARE
V_EMP_ID number := &p_emp_id;
type emp_rec_type is record(
id number, name varchar2(30));
emp_rec emp_rec_type;
BEGIN
EXECUTE IMMEDIATE 'SELECT id,name FROM EMPTEST
WHERE ID = :Emp_id'
INTO emp_rec
USING v_emp_id;
DBMS_OUTPUT.PUT_LINE('EMP ID: ' || emp_rec.id || CHR(10) ||
'LAST NAME: ' || emp_rec.name);
exception
when no_data_found then
dbms_output.put_line('Employee ID: ' ||v_emp_id || ' does not exist.');
END;
/
UTL_FILE
--------
WRITING INTO A FILE
--------------------
DECLARE
fp UTL_FILE.FILE_TYPE;
BEGIN
fp:=UTL_FILE.FOPEN('DD1','trial.txt','w');
UTL_FILE.PUT_LINE(fp,'HELLO WORLD');
UTL_FILE.FCLOSE(fp);
END;
/
APPENDING INTO A FILE
----------------------
DECLARE
fp UTL_FILE.FILE_TYPE;
BEGIN
fp:=UTL_FILE.FOPEN('DD1','trial.txt','a');
UTL_FILE.PUT_LINE(fp,'WELCOME');
UTL_FILE.FCLOSE(fp);
END;
/
READING FROM THE FILE
----------------------
DECLARE
fp UTL_FILE.FILE_TYPE;
X VARCHAR2(500);
BEGIN
fp:=UTL_FILE.FOPEN('DD1','trial.txt','r');
UTL_FILE.GET_LINE(fp,X);
WHILE(X IS NOT NULL)
LOOP
DBMS_OUTPUT.PUT_LINE(X);
UTL_FILE.GET_LINE(fp,X);
END LOOP;
UTL_FILE.FCLOSE(fp);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
/
BEGIN
htp.htmlOpen;
htp.headOpen;
htp.title('Welcome');
htp.headClose;
htp.bodyOpen;
htp.print('My home page');
htp.bodyClose;
htp.htmlClose;
END;
SQL> EXECUTE OWA_UTIL.SHOWPAGE;
<HTML>
<HEAD>
<TITLE>Welcome</TITLE>
</HEAD>
<BODY>
My home page
</BODY>
</HTML>
DBMS_SCHEDULER
---------------
create table t(c1 number);
/
-- creating the job
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'JOB_NAME',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN insert into t values((select nvl(max(c1),0)+1 from t));
END;',
start_date => SYSTIMESTAMP,
repeat_interval=>'FREQUENCY=minutely;INTERVAL=1',
enabled => TRUE);
END;
/
--Scheduling the same Job
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'PROG1',
program_type => 'PLSQL_BLOCK',
program_action => 'BEGIN insert into t values((select max(c1)+1 from t)); END
;');end;
/

--Creting the scheduler


BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE('Sc1',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY',
end_date => SYSTIMESTAMP +15);
END;
/
--Use the defined scheduler to schedule the job
BEGIN
DBMS_SCHEDULER.CREATE_JOB('Job2',
program_name => 'PROG1',
schedule_name => 'SC1',
enabled => TRUE);
END;
/
OR
BEGIN
DBMS_SCHEDULER.CREATE_JOB('JOB1',
schedule_name => 'SC1',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN ...; END;',
enabled => TRUE);
END;
/
--Creating the procedure
create or replace procedure proc1
is
begin
insert into t values((select max(c1)+1 from t));
END;
/

-- Scheduling the prcodure

DBMS_SCHEDULER.CREATE_PROGRAM(
program_name => 'PROG2',
program_type => 'STORED_PROCEDURE',
program_action => 'proc1');
/

DBMS_SCHEDULER.RUN_JOB('SCHEMA.JOB_NAME');
/
DBMS_SCHEDULER.stop_JOB('SCHEMA.JOB_NAME');
/
DBMS_SCHEDULER.drop_JOB('SCHEMA.JOB_NAME');
DBMS_METADATA
--------------
Oracle professionals must frequently "punch," or extract, table and index defini
tions from Oracle and move them to different systems.
This capability is very useful when you want to migrate a table definition onto
a new Oracle database.
set pagesize 0
set long 90000
SELECT DBMS_METADATA.GET_DDL( 'TABLE','EMPLOYEES','HR') FROM DUAL;
Extracting a whole schema
--------------------------
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM USER_TABLES u;
USING THE WHERE CLAUSE
---------------------
set pagesize 0
set long 90000
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM user_tables u
WHERE table_name like 'EMP%';
XML REPRESENTATION
-------------------
SELECT DBMS_METADATA.GET_XML
('TABLE', 'EMPLOYEES', 'HR')
FROM dual;
GRANTED PRIVILEGES ON OBJECT EMPLOYEES
--------------------------------------
SELECT DBMS_METADATA.GET_DEPENDENT_DDL
('OBJECT_GRANT', 'EMPLOYEES', 'HR')
FROM dual;
SYSTEM GRANTED PRIVILEGES TO USER HR
---------------------------------------
SELECT DBMS_METADATA.GET_GRANTED_DDL
('SYSTEM_GRANT', 'HR')
FROM dual;
FILTERS
-------
DBMS_METADATA.SET_FILTER(HANDLE,'SCHEMA','HR');
DBMS_METADATA.SET_FILTER(HANDLE,'INCLUDE_USER',TRUE);
- OBJECTS CONTAINING PRIVILEGED INFORMATION ABOUT THE USER IS ONLY RETRIEVED.
DBMS_METADATA.SET_FILTER(handle,
'IN (''PAYROLL'', ''HR'')');
DBMS_METADATA.SET_FILTER(handle,
'=''FUNCTION''');
DBMS_METADATA.SET_FILTER(handle,
'=''PROCEDURE''');
DBMS_METADATA.SET_FILTER(handle,
'=''PACKAGE''');
DBMS_METADATA.SET_FILTER(handle,
'LIKE ''PAYROLL%''', 'VIEW');

You might also like