PL SQL
PL SQL
PLSQL stands for "Procedural Language extensions to SQL", and can be used in Oracle
databases. PL SQL is closely integrated into the SQL language, yet it adds programming
constructs that are not native to SQL. PL/SQL also implements basic exception
handling. This tutorial contains an introduction to beginning pl sql. This Oracle pl/sql
tutorial also provides a hands on experience for beginning plsql. It contains many free
plsql examples which can be reused in your code.
Pl/Sql is the procedural implementation of sql i.e. you can pass sql statements in
procedural format using pl/sql. Normal sql does not have any procedural capabilities
moreover you can only pass one statement at a time to Oracle Engine. Hence, pl/sql
have come up to avoid this limitation. Hence, pl/sql is the structured programming
language for oracle. It's structure is similar to any other procedural language such as C
or C++
PL/SQL Tutorial
PL/SQL Tutorial
PL/SQL stands for Procedural Language/SQL. PL/SQL extends SQL by adding constructs
found in procedural languages, resulting in a structural language that is more powerful
than SQL. The basic unit in PL/SQL is a block. All PL/SQL programs are made up of
blocks, which can be nested within each other. Typically, each block performs a logical
action in he program. A block has the following structure:
DECLARE
BEGIN
EXCEPTION
Only the executable section is required. The other sections are optional. The only SQL
statements allowed in a PL/SQL program are SELECT, INSERT, UPDATE, DELETE and
several other data manipulation statements plus some transaction control. However,
the SELECT statement has a special form in which a single tuple is placed in variables;
more on this later. Data definition statements like CREATE, DROP, or ALTER are not
allowed. The executable section also contains constructs such as assignments,
branches, loops, procedure calls, and triggers, which are all described below (except
triggers). PL/SQL is not case sensitive. C style comments (/* ... */) may be used.
As with Oracle SQL programs, we can invoke a PL/SQL program either by typing in
sqlplus.
The most commonly used generic type is NUMBER. Variables of type NUMBER can hold
either an integer or a real number. The most commonly used character string type is
VARCHAR(n), where n is the maximum length of the string in bytes. This length is
required, and there is no default. For example, we might declare:
DECLARE
price NUMBER;
myBeer VARCHAR(20);
Note that PL/SQL allows BOOLEAN variables, even though Oracle does not support
BOOLEAN as a type for database columns.
Types in PL/SQL can be tricky. In many cases, a PL/SQL variable will be used to
manipulate data stored in a existing relation. In this case, it is essential that the
variable have the same type as the relation column. If there is any type mismatch,
variable assignments and comparisons may not work the way you expect. To be safe,
instead of hard coding the type of a variable, you should use the %TYPE operator. For
example:
DECLARE
myBeer Beers.name%TYPE;
gives PL/SQL variable myBeer whatever type was declared for the name column in
relation Beers.
A variable may also have a type that is a record with several fields. The simplest way to
declare such a variable is to use %ROWTYPE on a relation name. The result is a record
type in which the fields have the same names and types as the attributes of the
relation. For instance:
DECLARE
beerTuple Beers%ROWTYPE;
makes variable beerTuple be a record with fields name and manufacture, assuming that
the relation has the schema Beers(name, manufacture).
The initial value of any variable, regardless of its type, is NULL. We can assign values to
variables, using the ":=" operator. The assignment can occur either immediately after
the type of the variable is declared, or anywhere in the executable portion of the
program. An example:
DECLARE
a NUMBER := 3;
BEGIN
a := a + 1;
END;
run;
This program has no effect when run, because there are no changes to the database.
The simplest form of program has some declarations followed by an executable section
consisting of one or more of the SQL statements with which we are familiar. The major
nuance is that the form of the SELECT statement is different from its SQL form. After
the SELECT clause, we must have an INTO clause listing variables, one for each
attribute in the SELECT clause, into which the components of the retrieved tuple must
be placed.
Notice we said "tuple" rather than "tuples", since the SELECT statement in PL/SQL only
works if the result of the query contains a single tuple. The situation is essentially the
same as that of the "single-row select" discussed in Section 7.1.5 of the text, in
connection with embedded SQL. If the query returns more than one tuple, you need to
use a cursor. Here is an example:
e INTEGER,
f INTEGER
);
DECLARE
a NUMBER;
b NUMBER;
BEGIN
END;
run;
Fortuitously, there is only one tuple of T1 that has first component greater than 1,
namely (2,4). The INSERT statement thus inserts (4,2) into T1.
PL/SQL allows you to branch and create loops in a fairly familiar way.
... ...
END IF;
The following is an example, slightly modified from the previous one, where now we
only do the insertion if the second component is 1. If not, we first add 10 to each
component and then insert:
DECLARE
a NUMBER;
b NUMBER;
BEGIN
IF b=1 THEN
ELSE
END IF;
END;
run;
LOOP
END LOOP;
At least one of the statements in <loop_body> should be an EXIT statement of the form
The loop breaks if <condition> is true. For example, here is a way to insert each of the
pairs (1, 1) through (100, 100) into T1 of the above two examples:
DECLARE
i NUMBER := 1;
BEGIN
LOOP
i := i+1;
END LOOP;
END;
.run;
* EXIT by itself is an unconditional loop break. Use it inside a conditional if you like.
* A WHILE loop can be formed with
· <loop_body>
END LOOP;
· <loop_body>
END LOOP;
Here, <var> can be any variable; it is local to the for-loop and need not be declared.
Also, <start> and <finish> are constants.
Cursors
A cursor is a variable that runs through the tuples of some relation. This relation can be
a stored table, or it can be the answer to some query. By fetching into the cursor each
tuple of the relation, we can write a program to read and process the value of each
such tuple. If the relation is stored, we can also update or delete the tuple at the
current cursor position.
The example below illustrates a cursor loop. It uses our example relation T1(e,f) whose
tuples are pairs of integers. The program will delete every tuple whose first component
is less than the second, and insert the reverse tuple into T1.
1) DECLARE
3) b T1.f%TYPE;
/* Cursor declaration: */
4) CURSOR T1Cursor IS
5) SELECT e, f
6) FROM T1
7) WHERE e < f
8) FOR UPDATE;
9) BEGIN
11) LOOP
18) END;
19) .
20) run;
Procedures
PL/SQL procedures behave very much like procedures in other programming language.
Here is an example of a PL/SQL procedure addtuple1 that, given an integer i, inserts the
tuple (i, 'xxx') into the following example relation:
CREATE TABLE T2 (
a INTEGER,
b CHAR(10)
);
BEGIN
END addtuple1;
run;
There can be any number of parameters, each followed by a mode and a type. The
possible modes are IN (read-only), OUT (write-only), and INOUT (read and write). Note:
Unlike the type specifier in a PL/SQL variable declaration, the type specifier in a
parameter declaration must be unconstrained. For example, CHAR(10) and
VARCHAR(20) are illegal; CHAR or VARCHAR should be used instead. The actual length
of a parameter depends on the corresponding argument that is passed in when the
procedure is invoked.
Following the arguments is the keyword AS (IS is a synonym). Then comes the body,
which is essentially a PL/SQL block. We have repeated the name of the procedure after
the END, but this is optional. However, the DECLARE section should not start with the
keyword DECLARE. Rather, following AS we have:
... AS
<local_var_declarations>
BEGIN
<procedure_body>
END;
run;
The run at the end runs the statement that creates the procedure; it does not execute
the procedure. To execute the procedure, use another PL/SQL statement, in which the
procedure is invoked as an executable statement. For example:
run;
The following procedure also inserts a tuple into T2, but it takes both components as
arguments:
x T2.a%TYPE,
y T2.b%TYPE)
AS
BEGIN
VALUES(x, y);
END addtuple2;
run;
BEGIN
addtuple2(10, 'abc');
END;
run;
CREATE TABLE T3 (
a INTEGER,
b INTEGER
);
AS
BEGIN
b := 4;
END;
.
run;
DECLARE
v NUMBER;
BEGIN
addtuple3(10, v);
END;
run;
Note that assigning values to parameters declared as OUT or INOUT causes the
corresponding input arguments to be written. Because of this, the input argument for
an OUT or INOUT parameter should be something with an "lvalue", such as a variable
like v in the example above. A constant or a literal argument should not be passed in
for an OUT/INOUT parameter.
In the body of the function definition, "RETURN <expression>;" exits from the function
and returns the value of <expression>.
To find out what procedures and functions you have created, use the following SQL
query:
from user_objects
or object_type = 'FUNCTION';
Discovering Errors
PL/SQL does not always tell you about compilation errors. Instead, it gives you a cryptic
message such as "procedure created with compilation errors". If you don't see what is
wrong immediately, try issuing the command
Printing Variables
Sometimes we might want to print the value of a PL/SQL local variable. A ``quick-and-
dirty'' way is to store it as the sole tuple of some relation and after the PL/SQL
statement print the relation with a SELECT statement. A more couth way is to define a
bind variable, which is the only kind that may be printed with a print command. Bind
variables are the kind that must be prefixed with a colon in PL/SQL statements.
where the type can be only one of three things: NUMBER, CHAR, or CHAR(n).
2. We may then assign to the variable in a following PL/SQL statement, but we must
prefix it with a colon.
3. Finally, we can execute a statement
PRINT :<name>;
VARIABLE x NUMBER
BEGIN
:x := 1;
END;
run;
PRINT :x;
PL/SQL BLOCK
The pl/sql block contains the following section:--
A bit about it's working. When you typed out the pl/sql block for execution. It is sent to
the pl/sql engine, where procedural statements are executed; and sql statements are
sent to the sql executor in the oracle engine. Since pl/sql engine resides in the oracle
engine, the codes executes smoothly and efficiently.
PL/SQL DATA-TYPE
This is easy since it includes almost all the data types which u have used in sql such as
date, varchar, number, char etc etc... Some of the attributes such as %TYPE is also
used. This attribute automatically takes in the default data type of the sql table from
which u have passed the query. We will discuss this later.
Remember in pl/sql a variable name must begin with a character and can be followed
by maximum of 29 other characters. Reserved words can't be used unless enclosed
within double quotes. Variables must be separated from each other by at least one
space or by a punctuation mark. You can assign values of operator using := operator. I
won't discuss about logical comparisons operators such as <, > , >=, NOT, TRUE, AND,
OR, NULL etc since they r quite easy to understand.
REMEMBER: To display messages to the user the SERVEROUTPUT should be set to ON.
SERVEROUTPUT is a sql*plus environment parameter that displays the information
pased as a parameter to the PUT_LINE function.
EG: SET SERVEROUTPUT ON
IF and else.....
IF --Condition THEN
--Action
ELSEIF --Condition THEN
--Action
ELSE
--Action
END IF;
SIMPLE LOOP
loop
-- Sequence of statements;
end loop;
WHILE LOOP
While --condition
loop
--sequence of statements
end loop;
FOR LOOP
FOR i in 1..10
loop
--sequence of statements
end loop;
EXAMPLES
--ADDITION
declare
a number;
b number;
c number;
begin
a:=&a;
b:=&b;
c:=a+b;
dbms_output.put_line('Sum of ' || a || ' and ' || b || ' is ' || c);
Declare
a number;
s1 number default 0;
Begin
a:=1;
loop
s1:=s1+a;
exit when (a=100);
a:=a+1;
end loop;
dbms_output.put_line('Sum between 1 to 100 is '||s1);
End;
declare
n number;
sum1 number default 0;
endvalue number;
begin
endvalue:=&endvalue;
n:=1;
for n in 1.. endvalue
loop
if mod(n,2)=1
then
sum1:=sum1+n;
end if
end loop;
dbms_output.put_line('sum = ' || sum1);
end;
declare
n number;
endvalue number;
sum1 number default 0;
begin
endvalue:=&endvalue;
n:=1;
while (n < endvalue)
loop
sum1:=sum1+n;
n:=n+2;
end loop;
dbms_output.put_line('Sum of odd numbers between 1 and ' || endvalue || ' is ' ||
sum1);
end;
declare
ename varchar2(15);
basic number;
da number;
hra number;
pf number;
netsalary number;
begin
ename:=&ename;
basic:=&basic;
da:=basic * (41/100);
hra:=basic * (15/100);
--MAXIMUM OF 3 NUMBERS
Declare
a number;
b number;
c number;
d number;
Begin
dbms_output.put_line('Enter a:');
a:=&a;
dbms_output.put_line('Enter b:');
b:=&b;
dbms_output.put_line('Enter c:');
c:=&b;
if (a>b) and (a>c) then
dbms_output.putline('A is Maximum');
elsif (b>a) and (b>c) then
dbms_output.putline('B is Maximum');
else
dbms_output.putline('C is Maximum');
end if;
End;
declare
s1 emp.sal %type;
begin
select sal into s1 from emp
where ename = 'SMITH';
if(no_data_found)
then
raise_application_error
(20001,'smith is not present');
end if;
--PRIME NO OR NOT
DECLARE
no NUMBER (3) := &no;
a NUMBER (4);
b NUMBER (2);
BEGIN
FOR i IN 2..no - 1
LOOP
a := no MOD i;
IF a = 0
THEN
GOTO out;
END IF;
END LOOP;
<>
IF a = 1
THEN
DBMS_OUTPUT.PUT_LINE (no || ' is a prime number');
ELSE
DBMS_OUTPUT.PUT_LINE (no || ' is not a prime number');
END IF;
END;
Declare
a number:= 100;
begin
loop
a := a+25;
exit when a=250;
end loop;
dbms_output.put_line (to_Char(a));
end;
Declare
begin
for i in 1..10
loop
dbms_output.put_line(to_char(i));
end loop;
end;
declare
--takes the default datatype of the column of the table price
cost price.minprice%type;
begin
select stdprice into cost from price where prodial in (Select prodid from product where
prodese = "shampoo");
if cost > 7000 then
goto Upd;
end if;
<< Upd >>
Update price set minprice = 6999 where prodid=111;
end;
Declare
pi constant number(4,2) := 3.14;
radius number(5);
area number(14,2);
Begin
radius := 3;
While radius <=7
Loop
area := pi* power(radius,2);
Insert into areas values (radius, area);
radius:= radius+1;
end loop;
end;
Declare
given_number varchar(5) := '5639';
str_length number(2);
inverted_number varchar(5);
Begin
str_length := length(given_number);
For cntr in reverse 1..str_length
loop
inverted_number := inverted_number || substr(given_number, cntr, 1);
end loop;
dbms_output.put_line('The Given no is ' || given_number);
dbms_output.put_line('The inverted number is ' || inverted_number);
end;
Errors in pl/sql block can be handled...error handling refers to the way we handle the
errors in pl/sql block so that no crashing stuff of code takes place...This is exactly the
same as we do in C++ or java..right!!
There are two type:
===> predefined exceptions
===> user defined exceptions
The above 2 terms are self explanatory
predefined exceptions:
SYNTAX
begin
sequence of statements;
exception
when --exception name then
sequence of statements;
end;
EXAMPLES
DECLARE
e_rec emp%ROWTYPE;
e1 EXCEPTION;
sal1 emp.sal%TYPE;
BEGIN
SELECT sal INTO sal1 FROM emp WHERE deptno = 30 AND ename = 'John';
IF sal1 < 5000 THEN
RAISE e1;
sal1 := 8500;
UPDATE emp SET sal = sal1 WHERE deptno = 30 AND ename = 'John';
END IF;
EXCEPTION
WHEN no_data_found THEN
RAISE_APPLICATION_ERROR (-20001, 'John is not there.');
WHEN e1 THEN
RAISE_APPLICATION_ERROR (-20002, 'Less Salary.');
END;
Declare
s1 emp.sal %type;
begin
select sal into s1 from emp where ename='SOMDUTT';
if(no-data-found) then
raise_application_error(20001, 'somdutt is not there');
end if;
if(s1 > 10000) then
raise_application_error(20002, 'somdutt is earing a lot');
end if;
update emp set sal=sal+500 where ename='SOMDUTT';
end;
Declare
zero-price exception;
price number(8);
begin
select actualprice into price from item where ordid =400;
if price=0 or price is null then
raise zero-price;
end if;
exception
when zero-price then
dbms_output.put_line('raised xero-price exception');
end;
CURSORS
Cursor is a work area in pl/sql which is used by sql server used to store the result of a
query. Each column value is pointed using pointer. You can independently manipulate
cursor values. A bit about it's working..... suppose you ask for a query stored in the
server ... at first a cursor consisting of query result is created in server...now the cursor
is transferred to the client where again cursor is created and hence the result is
displayed......
Cursors are of 2 types: implicit and explicit.......implicit cursors are created by oracle
engine itself while explicit cursors are created by the users......cursors are generally
used in such a case when a query returns more than one rows....normal pl/sql returning
more than one rows givens error but using cursor this limitation can be avoided....so
cursors are used....
Cursor attributes
Very important: Cursor can be controlled using following 3 control statements. They are
Open, Fetch, Close.....open statement identifies the active set...i.e. query returned by
select statement...close statement closes the cursor...and fetch statement fetches rows
into the variables...Cursors can be made into use using cursor for loop and fetch
statement...we will see the corresponding examples...
EXAMPLES
begin
update employee set salary=salary *0.15
where emp_code = &emp_code;
if sql%found then
dbms_output.put_line('employee record modified successfully');
else
dbms_output.put_line('employee no does not exist');
end if;
end;
declare
rows_affected char(4);
begin
update employee set salary = salary*0.15 where job='programmers';
rows_affected := to_char(sql%rowcount);
if sql%rowcount > 0 then
dbms_output.put_line(rows_affected || 'employee records modified successfully');
else
dbms_output.put_line('There are no employees working as programmers');
end if;
end;
--EXPLICIT CURSOR EG
DECLARE
CURSOR c1 is SELECT * FROM emp;
str_empno emp.empno%type;
str_ename emp.ename%type;
str_job emp.job%type;
str_mgr emp.mgr%type;
str_hiredate emp.hiredate%type;
str_sal emp.sal%type;
str_comm emp.comm%type;
str_deptno emp.deptno%type;
rno number;
BEGIN
rno := &rno;
FOR e_rec IN c1
LOOP
IF c1%rowcount = rno THEN
DBMS_OUTPUT.PUT_LINE (str_empno || ' ' || str_ename || ' ' || str_job || ' ' || str_mgr || ' '
|| str_hiredate || ' ' || str_sal || ' ' || str_comm || ' ' || str_deptno);
END IF;
END LOOP;
END;
--ANOTHER EG DISPLAYING VALUE OF A TABLE
DECLARE
CURSOR c1 IS SELECT * FROM emp;
e_rec emp%rowtype;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO e_rec;
DBMS_OUTPUT.PUT_LINE('Number: ' || ' ' || e_rec.empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || ' ' || e_rec.ename);
DBMS_OUTPUT.PUT_LINE('Salary: ' || ' ' || e_rec.sal);
EXIT WHEN c1%NOTFOUND;
END LOOP;
CLOSE c1;
END;
DECLARE
CURSOR c1 IS SELECT * FROM emp ORDER BY sal DESC;
e_rec emp%rowtype;
BEGIN
FOR e_rec IN c1
LOOP
DBMS_OUTPUT.PUT_LINE('Number: ' || ' ' || e_rec.empno);
DBMS_OUTPUT.PUT_LINE('Name : ' || ' ' || e_rec.ename);
DBMS_OUTPUT.PUT_LINE('Salary: ' || ' ' || e_rec.sal);
EXIT WHEN c1%ROWCOUNT >= 10;
END LOOP;
END;
DECLARE
TYPE ecursor IS REF CURSOR RETURN emp%ROWTYPE;
ecur ecursor;
e_rec emp%ROWTYPE;
dn NUMBER;
BEGIN
dn := &deptno;
OPEN ecur FOR SELECT * FROM emp WHERE deptno = dn;
FOR e_rec IN ecur
LOOP
DBMS_OUTPUT.PUT_LINE ('Employee No : ' || e_rec.empno);
DBMS_OUTPUT.PUT_LINE ('Employee Salary: ' || e_rec.salary);
END LOOP;
END;
DECLARE
TYPE tcursor IS REF CURSOR;
tcur tcursor;
e1 emp%ROWTYPE;
d1 dept%ROWTYPE;
tname VARCHAR2(20);
BEGIN
tname := &tablename;
IF tname = 'emp' THEN
OPEN tcur FOR SELECT * FORM emp;
DBMS_OUTPUT.PUT_LINE ('Emp table opened.');
close tcur;
DBMS_OUTPUT.PUT_LINE ('Emp table closed.');
ELSE IF tname = 'dept' THEN
OPEN tcur FOR SELECT * FROM dept;
DBMS_OUTPUT.PUT_LINE ('Dept table opened.');
close tcur;
DBMS_OUTPUT.PUT_LINE ('Emp table closed.');
ELSE
RAISE_APPLICATION_ERROR (-20004, 'Table name is wrong');
END IF;
END;
Declare
Cursor c1(Dno number) is select * from emp where deptno = dno;
begin
for empree in c1(10) loop;
dbms_output.put_line(empree.ename);
end loop;
end;
TRIGGERS
Triggers are of following type: before or after trigger ....and for each row and for each
statement trigger... before trigger is fired before insert/update/delete statement while
after trigger is fired after insert/update/delete statement...for each row and for each
statements triggers are self explainatory..
EXAMPLE
-- A database trigger that allows changes to employee table only during the business
hours(i.e. from 8 a.m to 5.00 p.m.) from monday to saturday. There is no restriction on
viewing data from the table -CREATE OR REPLACE TRIGGER Time_Check BEFORE
INSERT OR UPDATE OR DELETE ON EMP BEGIN IF
TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) < 10 OR
TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) >= 17 OR TO_CHAR(SYSDATE,'DAY') = 'SAT'
OR TO_CHAR(SYSDATE,'DAY') = 'SAT' THEN RAISE_APPLICATION_ERROR (-20004,'YOU
CAN ACCESS ONLY BETWEEN 10 AM TO 5 PM ON MONDAY TO FRIDAY ONLY.'); END IF;
END; --YOU HAVE 2 TABLES WITH THE SAME STRUCTURE. IF U DELETE A RECORD FROM
ONE TABLE , IT WILL BE INSERTED IN 2ND TABLE ED TRIGGERNAME Create or replace
trigger backup after delete on emp fro each row begin insert into emp/values
(:old.ename,:old.job,:old.sal); end; save the file.. and then sql> @ triggername --To
STICK IN SAL FIELD BY TRIGGER MEANS WHEN U ENTER GREATER THAN 5000, THEN
THIS TRIGGER IS EXECUTED Create or replace trigger check before insert on emp for
each row when (New.sal > 5000); begin raise_application_error(-20000, 'your no is
greater than 5000'); end; --NO CHANGES CAN BE DONE ON A PARTICULAR TABLE ON
SUNDAY AND SATURDAY Create or replace trigger change before on emp for each row
when (to_char(sysdate,'dy') in ('SAT','SUN')) begin raise_application_error(-200001, 'u
cannot enter data in saturnday and sunday'); end; --IF U ENTER IN EMP TABLE ENAME
FIELD'S DATA IN ANY CASE IT WILL BE INSERTED IN CAPITAL LETTERS'S ONLY Create or
replace trigger cap before insert on emp for each row begin :New.ename =
upper(:New.ename); end; --A TRIGGER WHICH WILL NOT ALLOW U TO ENTER
DUPLICATE VALUES IN FIELD EMPNO IN EMP TABLE Create or replace trigger dubb
before insert on emp for each row Declare cursor c1 is select * from emp; x
emp%rowtype; begin open c1; loop fetch c1 into x; if :New.empno = x.empno then
dbms_output.put_line('you entered duplicated no'); elseif :New.empno is null then
dbms_output.put_line('you empno is null'); end if; exit when c1%notfound; end loop;
close c1; end;
Procedures and function are made up of a declarative part, an executable part and an
optional exception-handling part
Most important the difference between procedures and functions: A function must
return a value back to the caller. A function can return only one value to the calling
pl/sql block. By defining multiple out parameters in a procedure, multiple values can be
passed to the caller. The out variable being global by nature, its value is accessible by
any pl/sql code block including the calling pl/sql block.
The above syntax i think is self explanatory...but i will give you some details...IN :
specifies that a value for the argument must be specified when calling the procedure or
function. argument : is the name of an argument to the procedure or function.
parentheses can be omitted if no arguments are present. OUT : specifies that the
procedure passes a value for this argument back to its calling environment after
execution. IN OUT : specifies that a value for the argument must be specified when
calling the procedure and that the procedure passes a value for this argument back to
its calling environment after execution. By default it takes IN. Data type : is the data
type of an argument.
EXAMPLES
--SUM OF 2 Numbers
--DELETION PROCEDURE
declare
a number;
b number;
begin
sample(3000, b)
dbms_output.put_line(1th value of b is 11 b);
end ;
declare
sal1 number := 7999;
begin
getsal(sal1);
dbms_output.put_line('The employee salary is' || sal1);
end ;
You can make a procedure and functions similarly.....also if u wanna drop a function
then use drop function functionname and for procedure use drop procedure
procedurename
PACKAGES
A package is an oracle object, which holds other objects within it. Objects commonly
held within a package are procedures, functions, variables, constants, cursors and
exceptions. Packages in plsql is very much similar to those packages which we use in
JAVA......yeah!! java packages holds numerous classes..right!!!...
EXAMPLE
--SIMPLEST EG
--specification
create or replace package pack2 is
function rmt(x in number) return number;
procedure rmt1(x in number);
end;
--body
create or replace package body pack2 is
function rmt(x in number) return number is
begin
return (x*x);
end;
(how to run.....)
exec packagename.procedurename
i.e.
exec pack2.rmt1(3);
As shown above u can put in complicated procedures and functions inside the
package...I have just shown a simple example...you can easily modify the above code
to fit your requirement......Just try out packages which includes cursors, procedures and
functions..etc..Remeber pl/sql supports overloading...i.e. you can use the same function
or procedure name in your application but with different no or type of arguments.