PLSQLmy Updated
PLSQLmy Updated
•SQL is a single query that is used to •PL/SQL is a block of codes that used to
write the entire program blocks/
perform DML and DDL operations.
procedure/ function, etc.
•It is declarative, that defines what need PL/SQL is procedural that defines how
to be done, rather than how things need •the things needs to be done.
to be done.
•Execute as a single statement. •Execute as a whole block.
•Mainly used to manipulate data. •Mainly used to create an application.
•No interaction with the database
•Interaction with a Database server. server.
•It is an extension of SQL, so that it can
•Cannot contain PL/SQL code in it. contain SQL inside it.
PL/SQL ARCHITECTURE
The PL/SQL architecture mainly consists of following three components:
1.PL/SQL Block
2.PL/SQL Engine
3.Database Server
PL/SQL block:
•This is the component which has the actual PL/SQL code.
•This consists of different sections to divide the code logically (declarative
section for declaring purpose, execution section for processing statements,
exception handling section for handling errors)
•It also contains the SQL instruction that used to interact with the database
server.
•All the PL/SQL units are treated as PL/SQL blocks, and this is the starting stage
of the architecture which serves as the primary input.
PL/SQL Engine
•PL/SQL engine is the component where the actual processing of the codes
takes place.
•PL/SQL engine separates PL/SQL units and SQL part in the input.
•The separated PL/SQL units will be handled by the PL/SQL engine itself.
•The SQL part will be sent to database server where the actual interaction
with database takes place.
•It can be installed in both database server and in the application server.
Database Server:
•This is the most important component of Pl/SQL unit which stores the data.
•The PL/SQL engine uses the SQL from PL/SQL units to interact with the
database server.
•It consists of SQL executor which parses the input SQL statements and
execute the same.
STRUCTURE OF PL/SQL CODE
BLOCK
Declare section
Begin section
Exception section
End section
DECLARE --optional
<declarations>
BEGIN --mandatory
<executable statements. At least one executable statement is mandatory>
EXCEPTION --optional
<exception handles>
END; --mandatory
/
Note: A block should always be followed by ‘/’ which sends the information to the compiler about
the end of the block
FUNDAMENTALS OF PL/SQL
Character set
Operators
Literals
Variables and constants
Data types
Declarations
Assignments
Comments
•Character Set
The PL/SQL character set includes:
•Upper and lower-case letters, A .. Z and a .. z
•Numerals, 0 .. 9
•Symbols, ( ) + - * / < > = ! ~ ^ ; : . ' @ % , " # $ & _ | { } ? [ ]
•Tabs and spaces
PL/SQL is not case sensitive, so lower-case letters are equivalent to
corresponding upper-case letters except within string and character literals.
Operators
Arithmetic Operators:
Logical Operators:
Comparison Operators:
Literals
A literal is an explicit numeric, character, string, or Boolean value that is
used to initialize the constants and variables.
Numeric Literal:
Character Literal: 'Z' '%' '7' ' ' 'z' '('
String Literal:
Boolean Literal:
Variable and Constant
NUMBER: This data type is used to store numeric data (integers, real
numbers, and floating-point numbers).
CHAR: This data type is used to store alphanumeric data (words and
text). The CHAR datatype can have maximum size up to 32767 bytes.
VARCHAR2: This data type is used to store variable length character
data. For a VARCHAR2 that is 2000 bytes longer, PL/SQL dynamically
allocates only enough memory to hold the actual value.
DATE: This data type is used to store date and time data.
BOOLEAN: This data type is used to store TRUE, FALSE or NULL.
Declarations
Syntax:
Variable-name datatype(size);
Examples:
Age Number(5);
A Number(10,2);
Name Varchar2(20);
DOB Date;
Assignment
Assignment operator (:=) to get the value from the user.
SELECT INTO clause to get the value from database object.
Some examples using assignment operator are:
A := 10;
B := c + d;
Sal := Salary+1000;
Example using SELECT INTO clause:
Select salary into sal from employee where empid = 12;
Comments
Num := :Num;
When the program will execute, the system will ask to enter the value
and the user can enter any value. This is shown as follows:
Enter the value of Num: 10
DISPLAYING USER MESSAGE ON
THE SCREEN
DECLARE
◦ dept_rec dept%ROWTYPE;
◦ dept_rec.deptno;
◦ dept_rec.deptname;
SOME BASIC PL/SQL PROGRAMS
Declare
Begin
dbms_output.put_line ('Hello');
End;
Declare
a number(2);
b number(2);
c number(2);
Begin
a:=5;
b:=4;
c:=a + b;
dbms_output.put_line ('sum='||c);
End;
Example1
Declare
a number(2);
b number(2);
c number(2);
Begin
a:=:a;
b:=:b;
c:=a + b;
dbms_output.put_line('sum='||c);
End;
Example2
Declare
a number(5);
b number(5);
t number(6);
Begin
Select ta, da into a, b from emp where empid = 8;
t := a + b;
Update emp set total = t where empid = 8;
End;
Variable Scope in PL/SQL
PL/SQL allows the nesting of blocks, i.e., each program block may contain
another inner block. If a variable is declared within an inner block, it is not
accessible to the outer block. However, if a variable is declared and
accessible to an outer block, it is also accessible to all nested inner
blocks. There are two types of variable scope −
•Local variables − Variables declared in an inner block and not
accessible to outer blocks.
•Global variables − Variables declared in the outermost block or a
package.
DECLARE
-- Global variables
num1 number := 95;
num2 number := 85;
BEGIN
dbms_output.put_line('Outer Variable num1: ' || num1);
dbms_output.put_line('Outer Variable num2: ' || num2);
DECLARE
-- Local variables
num1 number := 195;
num2 number := 185;
BEGIN
dbms_output.put_line('Inner Variable num1: ' || num1);
dbms_output.put_line('Inner Variable num2: ' || num2);
END;
END;
Assigning SQL Query Results to PL/SQL Variables
DECLARE
c_id customers.id%type := 1;
c_name customers.name%type;
c_addr customers.address%type;
c_sal customers.salary%type;
BEGIN
SELECT name, address, salary INTO c_name, c_addr, c_sal
FROM customers
WHERE id = c_id;
dbms_output.put_line
('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal);
END;
/
declare
a int;
n varchar(20);
begin
select salary,name into a,n from customers where id=3;
dbms_output.put_line(a ||' '||n);
update customers set salary=a+500 where id=3;
dbms_output.put_line(a);
end;
Example of %type
Declare
a emp.ta%type;
b emp.da%type;
t emp.total%type;
Begin
Select ta, da into a, b from emp where empid = 8;
t := a + b;
Update emp set total = t where empid = 8;
End;
Example of %rowtype
Declare
Record emp%rowtype;
Begin
Select*into Record from emp where empid = 8;
Record.total := Record.ta + Record.da;
Update emp set total=Record.total where empid = 8;
End;
declare
t customers%rowtype;
begin
select * into t from customers where id=1;
dbms_output.put_line(t.name ||' '||t.id||' '||t.salary);
end;
declare
t customers%rowtype;
begin
select * into t from customers where id=1;
dbms_output.put_line(t.name ||' '||t.id||' '||t.salary||' ' ||
t.address);
end;
Branching statements
Declare
num1 number(2);
num2 number(2);
Begin
num1:=:num1;
num2:=:num2;
IF num1 > num2 THEN
dbms_output.put_line('greater is num1='||num1);
ELSE
dbms_output.put_line('greater is num2='||num2);
END IF;
End;
Declare
num1 number(2);
num2 number(2);
IF num1 > num2 THEN
num3 number(2); IF num2 > num3 THEN
dbms_output.put_line('greater is
Begin num1='||num1);
num1:=:num1; ELSE
dbms_output.put_line('greater is
num2:=:num2; num3='||num3);
END IF;
num3:=:num3; ELSE
IF num2 > num3 THEN
dbms_output.put_line('greater is
END IF; num2='||num2);
ELSE
End; dbms_output.put_line('greater is
num3='||num3);
END IF;
Loops
Declare
i number(2);
Begin
i:=1;
LOOP
dbms_output.put_line(i);
i:=i + 1;
EXIT WHEN i > 10;
END LOOP;
End;
While
Declare
a number(2);
Begin
a:=1;
WHILE a<=10
LOOP
dbms_output.put_line(a*a);
a:=a+1;
END LOOP;
End;
For
Declare
Total number(4);
i Number(2);
Begin
FOR i IN 1..10
LOOP
Total:=2*i;
dbms_output.put_line('2*' || i || '=' ||Total);
END LOOP;
End;
Declare
num1 number(2);
num2 number(2);
Begin
num1:=&num1;
num2:=&num2;
IF num1 > num2 THEN
GOTO O1;
ELSE
GOTO O2;
END IF;
<<O1>>
dbms_output.put_line('greater is num1='||num1);
GOTO O3;
<<O2>>
dbms_output.put_line('greater is num2='||num2);
<<O3>>
dbms_output.put_line('successful');
End;
Procedure
Declare
Glogal Variable Declarations;
Procedure ProcedureName
( Argument IN/OUT/IN OUT Datatype, ……)
IS/AS
Variable and Constant Declarations;
Begin
PL/SQL Statements;
Exception
Exception Handling Statements;
End ProcedureName;
Begin
Executable Statements;
Procedure Calling;
Exception
Exception Handling Statements;
End;
Creating a Function
Declare
Glogal Variable Declarations;
Function FunctionName
( Argument IN Datatype, ……….)
Return DataType
IS/AS
Variable and Constant Declarations;
Begin
PL/SQL Statements;
Exception
Exception Handling Statements;
End FunctionName;
Begin
Executable Statements;
Function Calling;
Exception
Exception Handling Statements;
End;
Creating a Stored Procedure
Create Or Replace Procedure ProcedureName
( Argument IN/OUT/IN OUT Datatype, …..)
IS/AS
Variable and Constant Declarations;
Begin
PL/SQL Statements;
Exceptionz
Exception Handling Statements;
End;
CREATING A TRIGGER
CREATE OR REPLACE TRIGGER TriggerName
BEFORE / AFTER
DELETE / INSERT / UPDATE OF
ColumnName
ON TableNamne
REFERENCING OLD AS old, NEW AS
new
FOR EACH ROW
WHEN Condition
DECLARE
Variable and Constant Declarations;
BEGIN
SQL and PL/SQL statements;
EXCEPTION
Error Handling Statements;
END;
Enabling or Disabling Triggers
Syntax:
SQL> Alter Trigger TriggerName Disable;
Example:
SQL> Alter Trigger Upper Disable;
Syntax:
SQL> Alter Table Tableneme
Disable All Triggers;
Example:
SQL> Alter Table Student Disable All
Triggers;
Syntax:
SQL> Drop Trigger TriggerName;
Example:
SQL> Drop Trigger Opr;
CURSORS
When a select statement is executed to access the data from a table then, the Oracle
engine needs a work area for query execution and to store the result of that query at
server side.
A cursor is a work area where the result of a SQL query is stored at the server
side.
Declare a cursor
Open a cursor
Fetch or Read from cursor
Close a cursor
Types of Cursors
Implicit Cursor
SQL%ISOPEN
It is a work area that is declared, opened and SQL%FOUND
closed internally by the Oracle engine. The SQL%NOTFOUND
user is not involved in the process of managing SQL%ROWCOUNT
the cursor
Explicit Cursor
%ISOPEN It is a work area that is declared, opened and
%FOUND closed externally by the user. It is also called as
%NOTFOUND user-defined cursors.
%ROWCOUNT
General Cursor Attributes
Implicit Cursor
Write a PL/SQL block to display a message that whether a record is updated or not
using SQL%FOUND and SQL%NOTFOUND.
Begin
Update student set city='pune' where rollno=&rollno;
IF SQL%FOUND THEN
dbms_output.put_line('Recor Updated');
END IF;
IF SQL%NOTFOUND THEN
dbms_output.put_line('Record not Updated');
END IF;
End;
Explicit Cursor
Syntax:
Cursor CursorName IS SELECT statement;
Here, SELECT statement can use all its clauses except INTO clause.
Example:
Cursor C IS SELECT rollno, name from student where branch=’CSE’;
Opening a Cursor
Syntax:
Open CursorName;
Example:
Open C;
Fetching a Record from Cursor
Syntax:
FETCH CursorName INTO Variables;
LOOP
FETCH C INTO my_record;
EXIT WHEN C%NOTFOUND;
-- Process data record
END LOOP;
LOOP
FETCH C INTO my_record;
EXIT WHEN C%NOTFOUND;
-- Process data record
END LOOP;
Closing a Cursor
Syntax:
CLOSE CursorName;
Example:
CLOSE C;
Write a PL/SQL block to display the name of the students belonging to CSE branch.
Declare
Cursor C Is Select name from student where branch='cse';
my_name student.name%Type;
Begin
Open C;
LOOP
Fetch C into my_name;
Exit When C%Notfound;
dbms_output.put_line(my_name);
END LOOP;
Close C;
End;
Write a PL/SQL block to increase the salary of all engineers by 1000.
Declare
Cursor C1 Is Select empid,salary from emp where job='engineer';
my_id emp.empid%Type;
my_sal emp.salary%Type;
Begin
Open C1;
LOOP
Fetch C1 into my_id,my_sal;
Exit When C1%Notfound;
Update emp set salary=salary+1000 where empid=my_id;
END LOOP;
Close C1;
End;