PLSQL
PLSQL
******
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
________________________________________________________________________________
_______________________________________
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
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;
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;
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
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
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);
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');