Plsql Notes New-1
-
Upload
sundarapu-gunabhiram -
Category
Documents
-
view
219 -
download
0
Transcript of Plsql Notes New-1
-
7/28/2019 Plsql Notes New-1
1/86
PLSQL NOTES
Focus Training Services 1
-
7/28/2019 Plsql Notes New-1
2/86
PLSQL NOTES
INDEX
VARIABLE DECLARATION . . . . . . . . 05 CONTROL STATEMENTS . . . . . . . . . 18. COMPOSITE VARIABLES . . . . . . . . 26
EXPLICIT CURSORS . . . . . . . . . . 31 EXCEPTIONS . . . . . . . . . . . . . 43 PROCEDURES . . . . . . . . . . . . . 52 FUNCTIONS . . . . . . . . . . . . . 55 PACKAGES . . . . . . . . . . . . . . 58 ORACLE PACKAGES . . . . . . . . . . 67 DYNAMIC SQL . . . . . . . . . . . . 75 TRIGGERS . . . . . . . . . . . . . . 77
PLSQL NOTES
Focus Training Services 2
-
7/28/2019 Plsql Notes New-1
3/86
Server Connection
Focus Training Services 3
-
7/28/2019 Plsql Notes New-1
4/86
Important Instructions
Each student has his own unix login id to server. Use ssh -l command to login to server.e.g. ssh -l nagnath 172.24.8.60
in above case nagnath is unix id. Default password is xxxxxx for all students. Change password usingpasswdcommand after first
login.
After login in server, set database name in ORACLE_SID
variable.
e.g. export ORACLE_SID=DB11G
in above case DB11G is database name. Conncet to database using your oracle sql login name
and password.
e.g. sqlplus nagnath/nagnath
In above case username is nagnath and password is also
nagnath.
For each student oracle login id and password will be
his name.
Connect to oracle from where you are
writing your
plsql programs.
e.g.[nagnath@server1 ~]$ cd plsql/
[nagnath@server1 ~]$ sqlplus nagnath/nagnath
Focus Training Services 4
-
7/28/2019 Plsql Notes New-1
5/86
PLSQLENGINE
Focus Training Services 5
PLSQL BLOCK
PLSQL ENGINE
PL/SQL
BLOCK
PROCEDURAL
STATEMENT
EXECUTION
SQL ENGINE
SQL statement executor
-
7/28/2019 Plsql Notes New-1
6/86
-
7/28/2019 Plsql Notes New-1
7/86
VARIABLE DECLARATION
Focus Training Services 7
-
7/28/2019 Plsql Notes New-1
8/86
DATA DICTIONARY VIEWS
USER_OBJECTS
USER_TABLE USER_VIEW USER_INDEX USER_SEQUENCE USER_SOURCE USER_CONSTRAINTS
Focus Training Services 8
DBA_TABLES
All tables in the entire database. Reserved
for user accounts that have dba privileges
ALL_TABLES
All tables owned by a user plus all
tables to which the user has been
granted access.
USER_TABLES
All tables owned by a particular database
user.
-
7/28/2019 Plsql Notes New-1
9/86
Types of variables
CHAR [(maximum length)]
VARCHAR2 (maximum length)
LONG
NUMBER [(precision , scale)]
BINARY INTEGER
PLS_INTEGER
BOOLEAN
BINARY INTEGER:-
Base type for integer between -2,147,483,647 and 2,147,483,647
PLS_INTEGER :-
Base type for signed integers between -
2,147,483,647 and 2,147,483,647.PLS_INTEGER values require
less storage and are faster than NUMBER and BINARY_INTEGER
values
BOOLEAN :-
Base type that stores one of three
possible values used for logical
calculations:TRUE,FALSE,NULL
Focus Training Services 9
-
7/28/2019 Plsql Notes New-1
10/86
This is the first program in plsql to print hello
world.
create or replace procedure sp11
as
-- First Program of Plsql-- This Program Prints-- Hello World on the Screenbegin
dbms_output.put_line('Hello World');
end;
To Compile Stored Procedures Type @file name/procedure name.sql on SQL Prompt To see the output on sql prompt type command
set serveroutput on when you are logged in.
TO Execute Stored Procedures Type exec procedure_name
--OUTPUT
SQL> @sp11.sql
Procedure
created.
No errors.
SQL> exec sp11
Hello Word
PL/SQL procedure successfully completed.
Focus Training Services 10
-
7/28/2019 Plsql Notes New-1
11/86
PLSQL NOTES
This program shows how to check errors in procedures.
create or replace procedure sp11_1
as
--This Program shows how to Read Errors
begin
dbms_output.put_line('Hello World')
--Semi colon missing at the end
end;
/
To See Errors Type 'show errors' on SQL prompt You can write 'show errors' at the end of procedure.
OUTPUTSQL> @sp11_1.sql
Warning: Procedure created with compilation errors.SQL> show errors
Errors for PROCEDURE SP11_1:
LINE/COL ERROR
-----------------------------------------------------------------
7/1 PLS-00103: Encountered the symbol
"END" when expecting
one of the following:
:= . ( % ;
The symbol ";" was substituted
for "END" to continue.
Focus Training Services 11
-
7/28/2019 Plsql Notes New-1
12/86
Variable declaration and assigning value to
variables.
create or replace procedure sp12
--This Program Shows How to declare variables, assign values
and constants.
as
v_myname
CHAR(50);
v_myage NUMBER(2) NOT NULL := 21;
v_mycity VARCHAR2(13) := Pune;
v_salary CONSTANT NUMBER := 1400;
begin
v_myname := Nagnath;
dbms_output.put_line('My Name is '||v_myname);
dbms_output.put_line('My Age is '||v_myage);
end;
/
show errors
OUTPUT:
SQL> @sp12.sqlProcedure created.
No errors.
SQL> exec sp12
My Name is Nagnath
My Age is 21
PL/SQL procedure successfully completed
Focus Training Services 12
-
7/28/2019 Plsql Notes New-1
13/86
Passing value to variables.
create or replace procedure sp13(l_name
varchar2,l_age number default 100)
--This Program shows how to
--Pass Values to procedures
--Accept values in variable
--without specifying its
--length
as
begindbms_output.put_line('Name Entered By User: '||l_name);
dbms_output.put_line('Age Entered By User: '||l_age);
end;
/
show errors
OUTPUT:SQL> @sp13.sql
Procedure created.
No errors.SQL> exec sp13('nagnath',21);
Name Entered By User: nagnath
Age Entered By User: 21
PL/SQL procedure successfully completed.
Focus Training Services 13
-
7/28/2019 Plsql Notes New-1
14/86
Selecting values from database tables.
create or replace procedure sp13_1
--This Programs Shows how to
--Execute SQL quries from plsql
as
l_employee_id Number := 100;
l_employee_name varchar2(30);
begin
select last_nameinto l_employee_name
from Employees
where employee_id = l_employee_id;
--into clause copies selected column's value
--into given variables
dbms_output.put_line('Employees Name is: '||
l_employee_name);
end;
/show errors
OUTPUT
SQL> @sp13_1.sql
Procedure created.
No errors.
SQL> exec sp13_1
Employees Name is: King
PL/SQL procedure successfully completed.
Focus Training Services 14
-
7/28/2019 Plsql Notes New-1
15/86
Use of %type variable.
create or replace procedure sp15(l_employee_id number)
--This Program shows
--how to use variables with same data type from tables
--Objective
--Accept EmployeeID From User
--Print Name of That Employee
as
l_last_name employees.last_name%type;
begin
select last_name into
l_last_name from
employees
where employee_id = l_employee_id;
dbms_output.put_line('Name of Employee is: '||l_last_name);
end;
/
show errors
SQL> @sp15
Procedure created.
No errors.
SQL> set serveroutput onSQL> exec sp15(200);
Name of Employee is: Whalen
PL/SQL procedure successfully completed.
Focus Training Services 15
-
7/28/2019 Plsql Notes New-1
16/86
Use of %type variable
create or replace procedure sp14--This Program shows
--how to declare Variables With %Type Attribute
--Means Same Data Type as in Table
as
l_last_name employees.last_name%type;
--In this case data type of
--l_last_name is same as
--data type of column last_name from employees
begin
select last_name
into l_last_name
from employees
where employee_id = 101;
dbms_output.put_line(l_last_name);
end;
/
show errors
OUTPUT:
SQL> @sp14.sql
Procedure created.
No errors.
SQL> exec sp14
Kochhar
PL/SQL procedure successfully completed.
Focus Training Services 16
-
7/28/2019 Plsql Notes New-1
17/86
PLSQL NOTES
Composite Variable:Records
create or replace procedure sp31
--This program shows how to
--create composite data types
--First Composite data type is record
as
TYPE emp_sal_record is RECORD
(last_name varchar2(20),
salary number(10));
emp_sal emp_sal_record;
--emp_sal_record can store
--last_name and salary of employee
--in single variable
begin
select last_name,salary
into emp_sal
from employees
where employee_id = 100;
dbms_output.put_line('Employee Name: '||emp_sal.last_name);
dbms_output.put_line('Employees Salary: '||emp_sal.salary);end;
/
show errors
Composite Data type Records stores more than one data type undersingle record.
OUTPUT:
SQL> @sp31.sql
Procedure created.
No errors.
SQL> set serveroutput on
SQL> exec sp31
Employee Name: King
Employees Salary: 24000
PL/SQL procedure successfully completed.
Focus Training Services 17
-
7/28/2019 Plsql Notes New-1
18/86
PLSQL NOTES
Composite Data type:%rowtype
create or replace procedure sp32
--This program shows how to
--create composite data types
--Second composite data type is %rowtype
as
emp_record employees%rowtype;
--emp_record stores
--all values of all columns
--from employees table
begin select *
into emp_record
from employees
where employee_id = 100;
dbms_output.put_line('Name: '||emp_record.last_name);
dbms_output.put_line('Department Id: '||
emp_record.department_id);
end;/
show errors
%rowtype variable is used to store all column data types insingle variable.
OUTPUT:
SQL> @sp32.sql
Procedure created.
No errors.
SQL> set serveroutput on
SQL> exec sp32
Name: King
Department Id: 90
PL/SQL procedure successfully completed.
Focus Training Services 18
-
7/28/2019 Plsql Notes New-1
19/86
Scope of variables in procedure.
create or replace procedure sp16
--This Program shows--Scope Of Variable in Stored Procedure
as
l_no number := 600;
l_msg varchar2(20) := 'Global Variable';
Begin
declare
l_no Number := 1;
l_msg varchar2(20) := 'Local variable';
begin
l_no := l_no +1;dbms_output.put_line('In Inner Block1');
dbms_output.put_line(l_no);
dbms_output.put_line(l_msg);
end;
Declare
l_no number :=100;
Begin
dbms_output.put_line('In Inner Block2');
dbms_output.put_line(l_no);
dbms_output.put_line(sp16.l_msg);end;
dbms_output.put_line('In Main');
dbms_output.put_line(l_no);
dbms_output.put_line(l_msg);
end;
/
show errors
Variables declared in main procedure (Outermost variable) areglobal variables.
Global variables can be accessable in all inner procedures. Inner procedures can define their own variables with same name
as global variable and access.
But it is not good programing practice.
Focus Training Services 19
-
7/28/2019 Plsql Notes New-1
20/86
OUTPUT
SQL> @sp16.sql
Procedure created.
No errors.
SQL> exec sp16
In Inner
Block2 2
Local Variable
In Inner
Block2 100
Global
Variable In
Inner Main 600
Global Variable
PL/SQL procedure successfully completed
Focus Training Services 20
-
7/28/2019 Plsql Notes New-1
21/86
DML Statements in Procedure
create or replace procedure sp17
--This Programs shows
--Executing DML statement in Plsql
as
begin
--Inserting Data From Plsql Procedure
insert into test(test_id,test_name)
values(1,'sql');
insert into test(test_id,test_name)
values(2,'plsql');
--Updating Data From Plsql Procedureupdate test
set test_id = 20
where test_id = 2;
--Deleting Data From Plsql Procedure
delete from test
where test_id = 20;
commit;
end;
/
show errors
--OUTPUT
create table test(test_id number,test_name varchar2(10));
Table created.
SQL> @sp17.sql
Procedure created.
No errors.
SQL> exec sp17
PL/SQL procedure successfully completed.
SQL> select * from test;
TEST_ID TEST_NAME
---------- ----------
1 sql
Focus Training Services 21
-
7/28/2019 Plsql Notes New-1
22/86
CONTROL STATEMENTS
-
7/28/2019 Plsql Notes New-1
23/86
Control Statement : If -Else Condition
create or replaceprocedure sp21(p_employee_id in number)
as
This procedure will give a salary raise
-- to an employee. Rules for the raise are as follows-- 1. 20% for Employees working with us for at least 12 years-- and whose salary is less than Rs. 6000/--- 2. 15% for Employees whose salary less than Rs. 6000/--- 3. 10% for employees working with us for at least 12 yearsl_hire_date employees.hire_date%type;
l_salary employees.salary%type;l_years_of_service number := 0;
l_new_salary number := 0;
begin
select hire_date,
salary
into l_hire_date,
l_salary
from employees
where employee_id = p_employee_id;
l_years_of_service := months_between(sysdate, l_hire_date)/12;
if l_salary < 6000 and l_years_of_service > 12 then
l_new_salary := l_salary * 1.2;
dbms_output.put_line('Giving 20% raise');
elsif l_salary < 6000 then
l_new_salary := l_salary * 1.15;
dbms_output.put_line('Giving 15% raise');
elsif l_years_of_service > 12 then
l_new_salary := l_salary * 1.1;
dbms_output.put_line('Giving 10% raise');
else
Focus Training Services 23
-
7/28/2019 Plsql Notes New-1
24/86
l_new_salary := l_salary;
dbms_output.put_line('No salary raise ');
end if;
update employees
set salary = l_new_salary
where employee_id = p_employee_id;
commit;
end;
/
show errors
IF condition THEN
statements;
[ELSIF condition THEN
statements;]
[ELSE
statements;]
END IF;
Focus Training Services 24
-
7/28/2019 Plsql Notes New-1
25/86
OUTPUT
SQL> @sp21.sql
Procedure created.No errors.
SQL> select salary from employees where employee_id=101;
SALARY
----------
17000
SQL> exec sp21(101);
Giving 10% raise
PL/SQL procedure successfully completed.
SQL> select salary from employees where employee_id=101;
SALARY
----------18700
Focus Training Services 25
-
7/28/2019 Plsql Notes New-1
26/86
PLSQL NOTES
Control Statement : Case
create or replace procedure sp22(p_grade in varchar2)
as
-- Case Statement-----------------
--CASE selector
-- WHEN expression1 THEN result1-- WHEN expression2 THEN result2-- ...-- WHEN expressionN THEN resultN-- [ELSE resultN+1;]--END;--A CASE expression selects a result and returns it
l_appraisal varchar2(100);
begin
l_appraisal := CASE p_grade
WHEN 'A' THEN 'Excellent'
WHEN 'B' THEN 'Very Good'
WHEN 'C' THEN 'Good'ELSE 'No such grade'
END;
DBMS_OUTPUT.PUT_LINE ('Grade: '|| p_grade ||
' Appraisal ' || l_appraisal);
end;
/
show errors
OUTPUT
SQL> @sp22.sql
Procedure created.
No errors.
SQL> exec sp22('C');
Grade: C Appraisal Good
PL/SQL procedure successfully completed.
Focus Training Services 26
-
7/28/2019 Plsql Notes New-1
27/86
PLSQL NOTES
Control Statements : Basic Loop
create or replace procedure sp23 ( p_loop_counter in number)
as
-- Basic Loop construct
------------------------
--LOOP
-- statement1;
-- ...
-- EXIT [WHEN condition ];
--END LOOP;
--Use the basic loop when the statements inside the-- loop must execute at least once.
i number;
Begin
i := 1;
loop
dbms_output.put_line(to_char(i) );
exit when i >= p_loop_counter;
i := i +
1; end loop;
end;/
show errors
Basic loop perform repetative actions. Programer can use exit condition to terminate the loop.
OUTPUT
SQL> @sp23.sql
Procedure created.No errors.
SQL> exec sp23(5);
1 2 3 4 5
PL/SQL procedure successfully completed.
Focus Training Services 27
-
7/28/2019 Plsql Notes New-1
28/86
PLSQL NOTES
Control Statement : While Loop
create or replace procedure sp24 ( p_loop_counter in number)
as
-- While Loop construct
------------------------
--WHILE condition LOOP
-- statement1;
-- statement2;
-- ...
--END LOOP;
-- Use the WHILE loop if the condition has to be-- evaluated at the start of each iteration.i number;
begin
i := 1;
while i @sp24.sql
Procedure created.
No errors.
SQL> exec sp24(5);
1 2 3 4 5
PL/SQL procedure successfully completed.
Focus Training Services 28
-
7/28/2019 Plsql Notes New-1
29/86
PLSQL NOTES
Control Statement : For Loop
create or replace procedure sp25( p_loop_counter in number)
as
-- For Loop construct
------------------------
--FOR counter IN [REVERSE]
-- lower_bound..upper_bound LOOP
-- ...--END LOOP;
-- Use a FOR loop if the number of iterations is known.i number;
begin-- Naming a loop is optional
for i in
1..p_loop_counter loop
sp5(to_char(i) , 2);
end loop my_for_loop;
dbms_output.put_line('------------------------');
-- now the reverse for loop
for i in reverse 1..p_loop_counter
loop
dbms_output.put_line(to_char(i) );end loop;
end;
/
show errors
OUTPUT
SQL> @sp25.sql
Procedure created.
No errors.
SQL> exec sp25(3);
1 2 3
------------------------
3
2
1
PL/SQL procedure successfully completed.
Focus Training Services 29
-
7/28/2019 Plsql Notes New-1
30/86
PLSQL NOTES
Infinite Loop
create or replace procedure sp54
as
-- How to write an infinite loop
begin
while (999 = 999)
loop
dbms_output.put_line('Hi');
end loop;
while ( true)
loop
dbms_output.put_line('Hi');
end loop;
end;
/
show errors
As programer did not mentioned exit condition, Proram will repeat printing infinitelly. This is bad programming.
Focus Training Services 30
-
7/28/2019 Plsql Notes New-1
31/86
PLSQL NOTES
EXPLICIT CURSORS
Focus Training Services31
-
7/28/2019 Plsql Notes New-1
32/86
PLSQL NOTES
Explicit Cursors Attribute
%ISOPEN AttributeA cursor attribute that can be appended to the name of a cursor or
cursor variable. If a cursor is open, cursor_name%ISOPEN returns
TRUE; otherwise, it returns FALSE.
%NOTFOUND AttributeA cursor attribute that can be appended to the name of a cursor or
cursor variable. Before the first fetch from an open cursor,
cursor_name%NOTFOUND returns NULL. Thereafter, it returns FALSE if
the last fetch returned a row, or TRUE if the last fetch failed to
return a row.
%ROWCOUNT AttributeA cursor attribute that can be appended to the name of a cursor or
cursor variable. When a cursor is opened, %ROWCOUNT is zeroed. Before
the first fetch, cursor_name%ROWCOUNT returns 0. Thereafter, itreturns the number of rows fetched so far. The number is incremented
if the latest fetch returned a row.
Focus Training Services 32
-
7/28/2019 Plsql Notes New-1
33/86
Explicit Cursors
create or replace procedure sp61
--This Program shows
--How to write explicit
cursor --How to open cursor
--How to fetch data from cursor
--How to close cursor
as
cursor c1 is select last_name,salary
from employees
where department_id = 20;
--Declaration of cursor
l_emp_name employees.last_name%type;
l_sal employees.salary%type;begin
open c1;
--Opening of a Cursor
loop
fetch c1 into l_emp_name,l_sal;
exit when c1%notfound;
--Fetching Data from Cursor
dbms_output.put_line(l_emp_name||'
'||to_char(l_sal));
end loop;
close c1;--Closing of Cursor
end;
/
show errors
For every SQL statement execution, certain area in memory isallocated.
Programer can give name to that area and as known as cursor. Using cursor, fetched rows can be process one by one.
Focus Training Services 32
-
7/28/2019 Plsql Notes New-1
34/86
PLSQL NOTES
OUTPUT
SQL> !vi sp61.sqlSQL> @sp61.sql
Procedure created.
No errors.
SQL> exec sp61
Hartstein
13000 Fay 6000
PL/SQL procedure successfully completed.
Focus Training Services 33
-
7/28/2019 Plsql Notes New-1
35/86
PLSQL NOTES
Explicit cursor : Fetching Data into records
create or replace procedure sp62
--This Program shows
--How to fetch data from cursor into records
as
cursor c1 is select *
from employees
where department_id=50;
--Cursor Declaration
rec_c1 c1%rowtype;
--Record Declarationbegin
open c1;
loop
fetch c1 into rec_c1;
exit when c1%notfound;
--Fetching Data from cursor into record
dbms_output.put_line('Name: '||
rec_c1.last_name);
dbms_output.put_line('Salary: '||
rec_c1.salary);
end loop;close c1;
end;
/
show errors
OUTPUT
SQL> @sp62.sql
Procedure created.
No errors.
SQL> exec sp62
Name: Hartstein
Salary: 13000
Name: Fay
Salary: 6000
PL/SQL procedure successfully completed.
Focus Training Services 34
-
7/28/2019 Plsql Notes New-1
36/86
PLSQL NOTES
Explicit Cursor : Use of For Loop
create or replace procedure sp63
--This Program shows
--Cursor For
as
cursor c1 is select *
from employees
where department_id = 20;
begin
for rec_c1 in c1
loop -implicit opendbms_output.put_line('Name: '||rec_c1.last_name);
dbms_output.put_line('salary: '||
to_char(rec_c1.salary));
end loop;
end;
/
show errors
OUTPUT:
SQL> @sp63.sql
Procedure created.
No errors.
SQL> exec sp63
Name: Hartstein
salary:
Hartstein Name:
Fay salary: FayPL/SQL procedure successfully completed.
Focus Training Services 35
-
7/28/2019 Plsql Notes New-1
37/86
PLSQL NOTES
Explicit Cursor : Subqueries
create or replace procedure sp64
--Cursor for loop using subqueries
as
l_last_name
varchar2(30);
begin
for l_last_name in (select last_name from employees where
department_id=20) loop
dbms_output.put_line('Name: '|| l_last_name);
end loop;
end;
/
OUTPUT:
SQL> @sp64.sql
Procedure created.No errors.
SQL> exec sp64
Name: Hartstein
Salary: 13000
Name: Fay
Salary: 6000
PL/SQL procedure successfully completed.
Focus Training Services 36
-
7/28/2019 Plsql Notes New-1
38/86
PLSQL NOTES
Explicit Cursor : Passing parameters to cursors
create or replace procedure sp65(deptno number,job varchar2)
--This Program shows
--How to pass parameters to cursor
as
cursor c1(l_deptno number,l_job varchar2) is
select employee_id,last_name
from employees
where department_id = l_deptno
and job_id = l_job;
rec_c1 c1%rowtype;
--Declaration of cursor
begin
for rec_c1 in c1(90,'AD_VP') loop
--Passing Paramenters to cursor
dbms_output.put_line('Depatment 80 '||' Job
id is SA_MAN');
dbms_output.put_line('Employee ID:'||
to_char(rec_c1.employee_id));dbms_output.put_line('Employee Name: '||
rec_c1.last_name);
end loop;
open c1(deptno,job);
--Passing Paramenters to cursor
loop
fetch c1 into rec_c1;
exit when c1%notfound;
dbms_output.put_line(deptno||' Job id is '||
job);
dbms_output.put_line('Employee ID:'|| to_char(rec_c1.employee_id));
dbms_output.put_line('Employee Name: '||
rec_c1.last_name);
end loop;
close c1;
end;
/
show errors
Focus Training Services 37
-
7/28/2019 Plsql Notes New-1
39/86
PLSQL NOTES
SQL> @sp65.sql
Procedure created.
No errors.
SQL> exec sp65(60,'IT_PROG');
Depatment 80 Job id is SA_MAN
Employee ID: 101
Employee Name: Kochhar
Depatment 80 Job id is SA_MAN
Employee ID: 102
Employee Name: De Haan
60 Job id is IT_PROG
Employee ID: 103
Employee Name: Hunold
60 Job id is IT_PROG
Employee ID: 104
Employee Name: Ernst
PL/SQL procedure successfully completed.
Focus Training Services 38
-
7/28/2019 Plsql Notes New-1
40/86
PLSQL NOTES
Explicit Cursor : Update Clause
create or replace procedure sp66
--This Program shows
--The For Update Clause in cursor
as
cursor c1 is
select *
from employees
where department_id = 20 for
update of salary nowait;
rec_c1 c1%rowtype;l_new_sal number;
begin
dbms_output.put_line(rpad('Employee',10)||
rpad('Old Salary',10)||
rpad('New Salary',10));
open c1;
loop
fetch c1 into rec_c1;
exit when c1%notfound;
if rec_c1.salary < 7000 then l_new_sal:= rec_c1.salary * 1.25;
update employees set salary = l_new_sal
where employee_id = rec_c1.employee_id;
else
l_new_sal := rec_c1.salary * 1.15;
update employees set salary = l_new_sal
where employee_id = rec_c1.employee_id;
end if;
dbms_output.put_line
(rpad(rec_c1.last_name,10)||
rpad(rec_c1.salary,10)||rpad(l_new_sal,10));
end loop;
close c1;
end;
/
show errors
Focus Training Services 39
-
7/28/2019 Plsql Notes New-1
41/86
PLSQL NOTES
Programer can lock rows Before performing any update or delete using cursor. While cursor is open no one can access selected rows.
SQL> @sp66.sql
Procedure created.
No errors.
SQL> exec sp66
Employee Old SalaryNew Salary
Hartstein 19771.38 22737.087
Fay 9918.75 11406.5625
PL/SQL procedure successfully completed.
Focus Training Services 40
-
7/28/2019 Plsql Notes New-1
42/86
PLSQL NOTES
Explicit Cursor : Where current of clause
create or replace procedure sp67
--This Program shows
--The use of where current of clause
as
cursor c1 is
select employee_id,salary
from employees
where department_id = 20 for
update of salary nowait;
l_new_sal number; rec_c1c1%rowtype;
begin
dbms_output.put_line(rpad('Employee',10)||
rpad('Old Salary',10)||
rpad('New Salary',10));
open c1;
loop
fetch c1 into rec_c1;
exit when c1%notfound;
if rec_c1.salary < 7000 thenl_new_sal := rec_c1.salary * 1.25;
update employees set salary =
l_new_sal
where current of c1;
else
l_new_sal := rec_c1.salary * 1.25;
update employees set salary =
l_new_sal
where current of c1;
end if;
end loop;close c1;
dbms_output.put_line(rpad(rec_c1.employee_id,10)||
rpad(rec_c1.salary,10)||
rpad(l_new_sal,10));
end;
/
show errors
Focus Training Services 41
-
7/28/2019 Plsql Notes New-1
43/86
PLSQL NOTES
Programer can update or delete only current row in cursor by defining 'where current of clause'
SQL> @sp67.sql Procedure created. No errors.
SQL> exec sp67
Employee Old SalaryNew Salary 202 11406.56 14258.2
PL/SQL procedure successfully completed.
Focus Training Services 42
-
7/28/2019 Plsql Notes New-1
44/86
-
7/28/2019 Plsql Notes New-1
45/86
Implicit Cursors in Plsql
create or replace procedure sp18
--This Program shows how to use
--Sql Cursor Attributes(Set by default by sql)
--SQL%ROWCOUNT
--SQL%FOUND
--SQL%NOTFOUND
--SQL%ISOPEN
as
begin
insert into test(test_id,test_name) values(3,'Red Hat');
if sql%found then
dbms_output.put_line('Row is inserted');
end if;
delete
from test;
dbms_output.put_line(sql%rowcount ||'
Rows are selected');
delete
from test;
if sql%notfound then
dbms_output.put_line('No row is deleted');
end if;
end;
/
show errors
Implicit cursors are implicitly define by oracle. They return information about result of query. SQL%ROWCOUNT returns number of rows affected by query. SQL%FOUND return true if atleast one row is affected by query. SQL%NOTFOUND return true if zero rows are affected by query.
Focus Training Services 44
-
7/28/2019 Plsql Notes New-1
46/86
SQL> @sp18.sql Procedure created. No errors.
SQL> select * from test; TEST_ID TEST_NAME
---------- ----------
1 sql SQL> exec sp18 Row is inserted
2 Rows are selected No row is deleted
PL/SQL procedure successfully completed.
Focus Training Services 45
-
7/28/2019 Plsql Notes New-1
47/86
PLSQL NOTES
EXCEPTIONS
Focus Training Services46
-
7/28/2019 Plsql Notes New-1
48/86
PLSQL NOTES
Exceptions: Predefined Exceptions
create or replace procedure sp81
--This Program shows
--How to handle Predefine exceptions
as
l_last_name employees.last_name%type;
begin
select last_name
into l_last_name
from employees
where employee_id = 99999;
dbms_output.put_line(l_last_name);
exception
when no_data_found then
--No_data_found is one of predefined exception
dbms_output.put_line('Employee Not exist');
end;
/
show errors
Focus Training Services 47
-
7/28/2019 Plsql Notes New-1
49/86
PLSQL NOTES
Exception is a kind of error that turminates user's programexecution example 'divide by 0'.
Oracle has defined approximately 20 errors occur most often. Known as 'Predefine Exceptions'.
OUTPUT
SQL> @sp81.sql
Procedure created.
No errors.
SQL> exec sp82
Employee Not exist
PL/SQL procedure successfully completed.
Focus Training Services 48
-
7/28/2019 Plsql Notes New-1
50/86
PLSQL NOTES
Exceptions : Non Predefined Exceptions
create or replace procedure sp82
--This program shows
--How to handle non predefine exceptions
as
duplicate_key exception;
PRAGMA EXCEPTION_INIT
(duplicate_key , -00001);
begin
insert into departments values(20,'New
Department',200,1800);
commit;
exception
when duplicate_key then dbms_output.put_line('Cannot
insert duplicate
department, department already exist');
end;
/
show errors
Non Predefine exceptions are defined by oracle server,but has no name.
Use Pragma exception to give name to respective exception.
SQL> @sp82.sql
Procedure created.
No errors.
SQL> set serveroutput on
SQL> exec sp82
Cannot insert duplicate department, department already exist
PL/SQL procedure successfully completed.
Focus Training Services 49
-
7/28/2019 Plsql Notes New-1
51/86
PLSQL NOTES
Exceptions : Others
create or replace procedure sp83
as
begin
delete from departments
where department_id = 20;
exception when others then
dbms_output.put_line('In Exception');
dbms_output.put_line(SQLCODE||SQLERRM);end;
/
show errors
Exception Others is used when programer does not knowthe oracle number associated with error.
Programer can find error associated number and error messageusing SQLCODE , SQLERRM
OUTPUT
SQL> @sp83.sql
Procedure created.
No errors.
SQL> exec sp83
In Exception
-2292ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated -
child record
found
PL/SQL procedure successfully completed.
Focus Training Services50
-
7/28/2019 Plsql Notes New-1
52/86
PLSQL NOTES
Exceptions : User Defined Exceptions
create or replace procedure sp84
as
l_last_name employees.last_name%type;
l_salary employees.salary%type;
l_new_sal float;
invalid_raise exception;
begin
select last_name,salaryinto l_last_name,l_salary
from employees
where employee_id = 100;
l_new_sal := l_salary * 1.20;
if l_new_sal > 2000 then
raise invalid_raise;
end if;
exception when invalid_raise then
dbms_output.put_line('Not Applicable Salary raise');
end;
/
show errors
Programer can introduce errors on certain conditions. Those errors are known as user define exception.
--OUTPUTSQL> @sp84.sqlProcedure created.
No errors.
SQL> exec sp84
Not Applicable Salary raise
PL/SQL procedure successfully completed.
Focus Training Services 51
-
7/28/2019 Plsql Notes New-1
53/86
PLSQL NOTES
Exceptions : Raise Application Errors
create or replace procedure sp85
as
l_last_name employees.last_name%type;
l_salary employees.salary%type; l_new_sal
float;
new_exception exception;
PRAGMA EXCEPTION_INIT(new_exception,-20999);
begin
select last_name,salary
into l_last_name,l_salaryfrom employees
where employee_id = 100;
l_new_sal := l_salary * 1.20;
if l_new_sal > 2000 then
raise_application_error(-20999,'This is not valid
salary increase');
end if;
exception when new_exception then
dbms_output.put_line('in exception');dbms_output.put_line(SQLCODE||SQLERRM);
end;
/
show errors
Programer can issue user define error messagesusing 'raise_application_error' procedure.
Progrmer can assign error code and error messagefor new exceptions.
Error code should be greater than 20,000.--OUTPUT
SQL> @sp85.sql
Procedure created.
No errors.
SQL> exec sp85
in exception
-20999ORA-20999: This is not valid salary increase
PL/SQL procedure successfully completed.
Focus Training Services 52
-
7/28/2019 Plsql Notes New-1
54/86
PLSQL NOTES
Exception : Flow through Procedures
create or replace procedure sp86(l_employee_id number)
--This program shows
--How exception handling passes from one procedure to other
as
l_salary number; l_last_name
varchar2(30);
begin
dbms_output.put_line('In outer Block');select salary
into l_salary
from employees
where employee_id = l_employee_id;
begin
dbms_output.put_line('In Inner Block');
select last_name
into l_last_namefrom employees;
end;
exception
when no_data_found then
dbms_output.put_line('No data found');
when too_many_rows then
dbms_output.put_line('too many rows');
end;/
show errors
Focus Training Services 53
-
7/28/2019 Plsql Notes New-1
55/86
PLSQL NOTES
OUTPUT
SQL> @sp86.sql
Procedure created.
No errors.
SQL> exec sp86(100);
In outer Block
In Inner Block
too many rows
PL/SQL procedure successfully completed.
SQL> exec sp86(1111);
In outer Block
No data found
PL/SQL procedure successfully completed.
Focus Training Services 54
-
7/28/2019 Plsql Notes New-1
56/86
PLSQL NOTES
Most Occurring Errors
Select:ORA-01403 : no data found
ORA-00913 : too many values
ORA-00902 : invalid datatype
ORA-00903 : invalid table name
ORA-00904 : invalid column name
ORA-00905 : missing keywordORA-00253 : length num of specified archive string 'name'
exceeds limit of num
Insert:ORA-02259 : duplicate UNIQUE/PRIMARY KEY specifications
ORA-02260 : table can have only one primary keyORA-02273 : this unique/primary key is referenced by some
foreign keys
ORA-02252 : check constraint condition not properly ended
ORA-01400 : mandatory (NOT NULL) column is missing or NULL
during insert
ORA-01556 : maximum number of extents exceededDelete:
ORA-02273 : this unique/primary key is referenced by some
foreign keys
Focus Training Services 55
-
7/28/2019 Plsql Notes New-1
57/86
PLSQL NOTES
PROCEDURES
Focus Training Services 56
-
7/28/2019 Plsql Notes New-1
58/86
PLSQL NOTES
Procedures : IN , OUT parameters
create or replace procedure sp91(l_emp_id in number,
l_salary out number)
--This Programs shows
--How to use in,out parameter
as
begin
select salary
into l_salary
from Employees
where employee_id = l_emp_id;end;
/
show errors
create or replace procedure sp92
as
salary number;
begin
sp91(100,salary);
--salary used as out parameter in sp91
dbms_output.put_line(salary);end;
/
show errors
In parameter used to pass value to procedure. Out parameter is used to pass value from parameter.
OUTPUT
SQL> @sp91.sql
Procedure created.
No errors.
SQL> @sp92.sql
Procedure created.
No errors.
SQL> exec sp92
24000
PL/SQL procedure successfully completed.
Focus Training Services 57
-
7/28/2019 Plsql Notes New-1
59/86
PLSQL NOTES
Procedures : IN OUT Parameters
create or replace procedure sp93
--This program shows
--How to use inout parameter
as
p_phone_no varchar2(20);
begin
p_phone_no := '1234567890';
sp94(p_phone_no);
dbms_output.put_line(p_phone_no);
end;/
show errors
create or replace procedure sp94
(p_phone_no IN OUT varchar2)
is
begin
p_phone_no := '(' || substr(p_phone_no,1,3) ||
')'||' '|| substr(p_phone_no,4,3) ||
'-' || substr(p_phone_no,7);end;
/
show errors
IN OUT parameter used to pass value to procedure and return somevalue in the same variable.
i.e. Programer need only 1 variable.OUTPUT
SQL> @sp94.sql
Procedure created.
No errors.
SQL> @sp93.sql
Procedure created.
No errors.
SQL> exec sp93
(123) 456-7890
PL/SQL procedure successfully completed.
Focus Training Services 58
-
7/28/2019 Plsql Notes New-1
60/86
PLSQL NOTES
FUNCTIONS
Focus Training Services 59
-
7/28/2019 Plsql Notes New-1
61/86
PLSQL NOTES
Functions
create or replace function get_dept_name(dept_no
departments.department_id%type)
return varchar2
--This program shows
--How to write user define functions
is
l_dept_name departments.department_name%type;
begin
select department_name
into l_dept_name
from Departments
where department_id = dept_no;
return l_dept_name;
end;
/
show errors
Functions are used when one task is executed repeatedly. Functions are similar to procedures. Functions always returns some value to callie. After functions are created,
they can be called from sql query also.
Focus Training Services 60
-
7/28/2019 Plsql Notes New-1
62/86
PLSQL NOTES
OUTPUT
SQL> @sp10_1.sql
Function created.
No errors.
SQL> select last_name,department_name
2 from employees e,departments d
3 where e.department_id = d.department_id
4 and employee_id = 100;
LAST_NAME DEPARTMENT_NAME
------------------------- ------------------------------
King Executive
SQL> select last_name,get_dept_name(department_id)
2 from employees
3 where employee_id = 100;
LAST_NAME GET_DEPT_NAME(DEPARTMENT_ID)
------------------------ ------------------------------
King Executive
Focus Training Services 61
-
7/28/2019 Plsql Notes New-1
63/86
PLSQL NOTES
PACKAGES
Focus Training Services 62
-
7/28/2019 Plsql Notes New-1
64/86
PLSQL NOTES
Packages
create or replace package calculator as
--This Programs shows package declaration/specification
--How to create package with public procedures
procedure add(no1 number, no2 number);
procedure subtract(no1 number, no2 number);
end calculator;
/show errors
Package use to group related procedures together. In Package declaration declare names of procedures and global
variables.
In Package body write code for those procedures.create or replace package body calculator is
--This Program shows
--How to declare body of package
procedure add(no1 number,no2 number)
is
begin
dbms_output.put_line('Addition is: '||to_char(no1 +
no2));
end add;
procedure subtract(no1 number,no2 number)
is
begin
dbms_output.put_line('Subtraction is: '||to_char(no1
- no2));
end subtract;
end calculator;
/
show errors
Focus Training Services 63
-
7/28/2019 Plsql Notes New-1
65/86
PLSQL NOTES
SQL> @cal_pac.sql
Package created.
No errors.
SQL> @cal.sql
Package body
created. No errors.
SQL> exec calculator.add(20,30);
Addition is: 50
PL/SQL procedure successfully completed.
SQL> exec calculator.subtract(30,40);
Subtraction is: -10
PL/SQL procedure successfully completed.
Focus Training Services 64
-
7/28/2019 Plsql Notes New-1
66/86
PLSQL NOTES
Package
create or replace package calculator as
--This Programs shows
--How to create package with public procedures
--How to define global variables with default values
--How to define public functions
count_add number := 0;
count_subtract number := 0;
procedure add(no1 number, no2 number);
procedure subtract(no1 number, no2 number);
function get_add_count return number;
function get_subtract_count return number;
end calculator;
/
show errors
Focus Training Services 65
-
7/28/2019 Plsql Notes New-1
67/86
PLSQL NOTES
create or replace package body calculator is
--This Program shows
--How to define private procedures in package body
procedure print(text varchar2);
function get_add_count return number
as
begin
return count_add;
end get_add_count;
function get_subtract_count return number
as
begin
return count_subtract;
end get_subtract_count;
procedure add(no1 number,no2 number)
is
begin
count_add := count_add + 1; print('Addition
is: '||to_char(no1 + no2));
end add;
procedure subtract(no1 number,no2 number)
is
begin
count_subtract := count_subtract + 1;
print('Subtraction is: '||to_char(no1 - no2));
end subtract;
procedure print(text varchar2)
is
begin
dbms_output.put_line(text);
end print;
end calculator;
/
show errors
Focus Training Services 66
-
7/28/2019 Plsql Notes New-1
68/86
PLSQL NOTES
SQL> @cal1.sql
Package body
created. No errors.
SQL> !vim cal1.sql
SQL> @cal_pac1.sql
Package created.
No errors.
SQL> @cal1.sql
Package body
created. No errors.
SQL> exec calculator.add(5,2);
Addition is: 7
PL/SQL procedure successfully completed.
SQL> exec calculator.subtract(10,5);
Subtraction is: 5
PL/SQL procedure successfully completed.
Focus Training Services 67
-
7/28/2019 Plsql Notes New-1
69/86
PLSQL NOTES
Package : Procedure Overloading
create or replace package calculator1 as
--This Programs shows
--How to create package with public procedures
--And Procedure overloading
procedure add(no1 number, no2 number);
procedure add(no1 varchar2, no2 varchar2);
procedure add(no1 number, no2 number, no3 number);
end calculator1;
/
show errors
Focus Training Services 68
-
7/28/2019 Plsql Notes New-1
70/86
PLSQL NOTES
create or replace package body calculator1 is
procedure add(no1 number,no2 number)
is
begin
dbms_output.put_line('Addition is: '||to_char(no1 +
no2));
end add;
procedure add(no1 varchar2,no2 varchar2)
is
begin
dbms_output.put_line('Concatination is: '||no1 ||
no2);
end add;
procedure add(no1 number,no2 number,no3 number)
is
begin
dbms_output.put_line('Subtraction is: '||to_char(no1
+ no2 + no3));
end add;
end calculator1;
/
show errors
Procedure Overloading means defining procedure withsame name but with different parameters,data types.
In above package procedure add is overloaded.
Focus Training Services 69
-
7/28/2019 Plsql Notes New-1
71/86
PLSQL NOTES
SQL> exec calculator1.add(10,20);
Addition is: 30
PL/SQL procedure successfully completed.
SQL> exec calculator1.add('scott','tiger');
Concatination is: scott tiger
PL/SQL procedure successfully completed.
SQL> exec calculator1.add(10,20,30);
Addition is: 60
PL/SQL procedure successfully completed.
Focus Training Services 70
-
7/28/2019 Plsql Notes New-1
72/86
PLSQL NOTES
ORACLE PACKAGES
Focus Training Services 71
-
7/28/2019 Plsql Notes New-1
73/86
PLSQL NOTES
Default Packages : UTL_FILE
create or replace procedure sp11_1
--This Program shows
--How to send mails using UTL_MAIL package
as
ora_no number; ora_msg
varchar2(100);
begin
UTL_MAIL.SEND
( sender => '[email protected]',recipients => '[email protected]',
cc => '[email protected]',
bcc => '[email protected]',
subject => 'test mail',
message => 'hi how r u??');
dbms_output.put_line('Message send successfully');
exception when others then
ora_no := sqlcode;
ora_msg := sqlerrm;
dbms_output.put_line('Message not send');
dbms_output.put_line(ora_no ||' '||ora_msg);
end;
/
show errors
Focus Training Services 72
-
7/28/2019 Plsql Notes New-1
74/86
PLSQL NOTES
OUTPUT
SQL> @sp11_1.sql
Procedure created.
No errors.
SQL> exec sp11_1
Message send successfully
PL/SQL procedure successfully completed.
Focus Training Services 73
-
7/28/2019 Plsql Notes New-1
75/86
PLSQL NOTES
Default Packages : UTL_FILE
create or replace procedure sp11_2
--This programs show
--How to read data from text file
--using UTL_FILE Package
as
v_dir varchar2(200);
--Specify Directory name and path
v_file_name varchar2(100);
--Specify File Name
v_line varchar2(500)--Accept file line by line in this variable
v_file UTL_FILE.FILE_TYPE;
--File Handler
begin
v_dir := '/home/gaurav/plsql/';
v_file_name :='utl_file.txt';
v_file :=
UTL_FILE.FOPEN(v_dir,v_file_name,'r');
--File Open in read only modeloop
begin
UTL_FILE.GET_LINE(v_file,v_line);
exception
when no_data_found then
exit;
end;
dbms_output.put_line(v_line);
end loop;end;
/
show errors
Focus Training Services 74
-
7/28/2019 Plsql Notes New-1
76/86
PLSQL NOTES
OUTPUT
[gaurav@server1 plsql]$ cat utl_file.txt
hello
how r u??
gaurav
OUTPUT
SQL> !vim sp11_2.sql
SQL> @sp11_2.sql
Procedure created.
No errors.
SQL> exec
sp11_2 hello
how r u??
gaurav
PL/SQL procedure successfully completed.
Focus Training Services 75
-
7/28/2019 Plsql Notes New-1
77/86
PLSQL NOTES
Default Packages : DBMS_SCHEDULER
create or replace procedure sp11_6
--This procedure shows
--How to use default package
--DBMS_SCHEDULER to schedule some task
as
orr_code number;
orr_msg varchar2(500);
begin
--create_job is inbuild procedure in DBMS_SCHEDULER
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'update_sales',
job_type => 'STORED_PROCEDURE',
job_action => 'sp11_4',
start_date => '20-APR-10 03.10.00.000000000 PM
ASIA/CALCUTTA',
repeat_interval => 'FREQ=SECONDLY;INTERVAL=10',
end_date => '20-APR-10 03.11.00.000000000 PM
ASIA/CALCUTTA',
comments => 'My new job');
exception when others then
orr_code := sqlcode;
orr_msg := sqlerrm;
dbms_output.put_line(orr_code||' '||orr_msg);
end;
/
show errors
Focus Training Services 76
-
7/28/2019 Plsql Notes New-1
78/86
PLSQL NOTES
OUTPUT
15:04:48 SQL> truncate table test_sch;
Table truncated.
15:04:57 SQL> @sp11_6.sql
Procedure created.
No errors.
15:05:01 SQL> exec sp11_6
PL/SQL procedure successfully completed.
15:05:06 SQL> execdbms_scheduler.set_scheduler_attribute('MAX_JOB_SLAVE_PROCESSES',
2);
-- requires manage scheduler privilegePL/SQL procedure successfully completed.
15:05:22 SQL> exec dbms_scheduler.enable('update_sales');
-- enable the job
PL/SQL procedure successfully completed.
15:05:43 SQL> select * from test_sch;
no rows selected
15:07:31 SQL> select count(*) from test_sch;
COUNT(*)
----------0
15:09:41 SQL> /
COUNT(*)
----------
100
Focus Training Services 77
-
7/28/2019 Plsql Notes New-1
79/86
PLSQL NOTES
15:10:04 SQL> /
COUNT(*)
----------
200
15:10:14 SQL> /
COUNT(*)
----------
300
15:10:27 SQL> /
COUNT(*)
----------
400
15:10:37 SQL> /
COUNT(*)
----------
500
15:10:46 SQL> /
COUNT(*)
----------
600
15:10:53 SQL> /
COUNT(*)
----------600
Focus Training Services 78
-
7/28/2019 Plsql Notes New-1
80/86
PLSQL NOTES
DYNAMIC SQL
Focus Training Services 79
-
7/28/2019 Plsql Notes New-1
81/86
PLSQL NOTES
Dynamic Sql
create or replace procedure sp12_1(l_table_name varchar2)
--This program shows
--How to build dynamic sql
queries. as
sql_query varchar2(50);
l_count number;
begin
sql_query := 'select count(*) from '||l_table_name;
execute immediate sql_query into l_count;
--Write sql command in a varchar2 variable
--And then use command 'execute immediate'
--Accept returing value in appropriate variable
dbms_output.put_line(l_count);
end;
/
show errors
OUTPUT
SQL> @sp12_1.sql
Procedure created.
No errors.
SQL> exec sp12_1('REGIONS');
4
PL/SQL procedure successfully completed.
Focus Training Services 80
-
7/28/2019 Plsql Notes New-1
82/86
PLSQL NOTES
TRIGGERS
Focus Training Services 81
-
7/28/2019 Plsql Notes New-1
83/86
PLSQL NOTES
Trrigers
create or replace trigger chk_emp_sal
--This programs shows
--How to declare
triggers --for each row
before insert or update
of salary
on employees
for each row
declare
v_error VARCHAR2(2000);
begin
if :new.salary > 25000 then
v_error:=:old.first_name||' cannot have that much!';
raise_application_error(-20999,v_error);
end if;
end;
/show errors
Oracle lets you define procedures called triggers
that run implicitly when an INSERT, UPDATE, or
DELETE statement is issued against the associated
table or, in some cases, against a view, or when
database system actions occur.
Focus Training Services 82
-
7/28/2019 Plsql Notes New-1
84/86
PLSQL NOTES
OUTPUT
SQL> @14_1.sql
Trigger created.
No errors.
SQL> insert into
employees(EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,SALARY)
2 values(215,'Bhide','[email protected]',sysdate,'IT_PROG',26000);
insert into
employees(EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,SALARY)
*
ERROR at line 1:
ORA-20999: cannot have that much!
ORA-06512: at "HR.CHK_EMP_SAL", line 7
ORA-04088: error during execution of trigger 'HR.CHK_EMP_SAL'
Focus Training Services 83
-
7/28/2019 Plsql Notes New-1
85/86
PLSQL NOTES
Triggers : Updating,Inserting,Deleting
create or replace trigger trig_example
before insert or delete or update on trig_eg
for each row
declare
ChangeType varchar2(10);
begin
/* Use 'I' for an INSERT, 'D' for DELETE, and 'U' for UPDATE. */
if inserting then
ChangeType := 'I';
elsif updating then
ChangeType := 'U';
else
ChangeType := 'D';
end if;
insert into changes_record values(ChangeType,USER,SYSDATE);
end trig_example;
/
show errors
Focus Training Services 84
-
7/28/2019 Plsql Notes New-1
86/86
PLSQL NOTES
OUTPUT
SQL> @sp14_2.sql
Trigger created.
No errors.
SQL> select * from CHANGES_RECORD;no rows selected
SQL> insert into trig_eg values(1,'aaa');
1 row created.
SQL> insert into trig_eg values(2,'bbb');
1 row created.
SQL> update trig_eg set name = 'xxxx' where id = 2;
1 row updated.
SQL> delete from trig_eg where id = 2;
1 row deleted.
SQL> select * from CHANGES_RECORD;
CHANGE USER_NAME CHANGE_DA---------- ---------- ---------
I GAURAV 18-APR-10
I GAURAV 18-APR-10
U GAURAV 18-APR-10
D GAURAV 18-APR-10
SQL> select * from trig_eg;
ID NAME