100% found this document useful (1 vote)
265 views

PLSQL Examples

The document contains notes on PL/SQL including topics like variable declaration, control statements, explicit cursors, exceptions, procedures, functions, packages, Oracle packages, dynamic SQL and triggers. It provides examples of PL/SQL code demonstrating different PL/SQL features like declaring variables, passing parameters, selecting from tables, using %TYPE and %ROWTYPE variables, handling errors and exceptions, and using DML statements. The document is intended as a reference for students learning PL/SQL.

Uploaded by

shrikant
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
265 views

PLSQL Examples

The document contains notes on PL/SQL including topics like variable declaration, control statements, explicit cursors, exceptions, procedures, functions, packages, Oracle packages, dynamic SQL and triggers. It provides examples of PL/SQL code demonstrating different PL/SQL features like declaring variables, passing parameters, selecting from tables, using %TYPE and %ROWTYPE variables, handling errors and exceptions, and using DML statements. The document is intended as a reference for students learning PL/SQL.

Uploaded by

shrikant
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 81

PLSQLNOTES

PLSQL
NOTES
ORACLE9i

GauravBhide

_____________________________________________________________________
FocusTrainingServices1

PLSQLNOTES

INDEX
VARIABLEDECLARATION........05
CONTROLSTATEMENTS.........18
COMPOSITEVARIABLES........26
EXPLICITCURSORS..........31
EXCEPTIONS.............43
PROCEDURES.............52
FUNCTIONS.............55
PACKAGES..............58
ORACLEPACKAGES..........67
DYNAMICSQL............75
TRIGGERS..............77

_____________________________________________________________________
FocusTrainingServices2

PLSQLNOTES

ServerConnection

_____________________________________________________________________
FocusTrainingServices3

PLSQLNOTES

ImportantInstructions
Eachstudenthashisownunixloginidtoserver.
Usesshlcommandtologintoserver.
e.g.sshlgaurav172.24.0.254
inabovecasegauravisunixid.
Defaultpasswordisxxxxxxforallstudents.
Change password using passwd commnad after first
login.
Afterlogininserver,setdatabasenameinORACLE_SID
variable.
e.g.exportORACLE_SID=rahul
inabovecaserahulisdatabasename.
Conncet to database using your oracle sql login name
andpassword.
e.g. sqlplusgaurav/gaurav
Inabovecaseusernameisgauravandpasswordisalso
gaurav.
Foreachstudentoracleloginidandpasswordwillbe
hisname.
Connect to oracle from where you are writing your
plsqlprograms.
e.g.[gaurav@server1~]$cdplsql/
[gaurav@server1~]$sqlplusgaurav/gaurav

_____________________________________________________________________
FocusTrainingServices4

PLSQLNOTES

VARIABLEDECLARATION

_____________________________________________________________________
FocusTrainingServices5

PLSQLNOTES

Thisisthefirstprograminplsqltoprinthelloworld.
createorreplaceproceduresp11
as
FirstProgramofPlsql
ThisProgramPrints
HelloWorldontheScreen
begin
dbms_output.put_line('HelloWorld');
end;

ToCompileStoredProcedures

Type@filename/procedurename.sqlonSQLPrompt

Toseetheoutputonsqlprompttypecommand

'setserveroutputon'whenyouareloggedin.

TOExecuteStoredProcedures

Typeexecprocedure_name

OUTPUT
SQL>@sp11.sql
Procedurecreated.
Noerrors.
SQL>execsp11
HelloWord
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices6

PLSQLNOTES

Thisprogramshowshowtocheckerrorsinprocedures.
createorreplaceproceduresp11_1
as
ThisProgramshowshowtoReadErrors
begin
dbms_output.put_line('HelloWorld')
Semicolonmissingattheend
end;
/

ToSeeErrorsType'showerrors'onSQLprompt

Youcanwrite'showerrors'attheendofprocedure.

OUTPUT
SQL>@sp11_1.sql
Warning:Procedurecreatedwithcompilationerrors.
SQL>showerrors
ErrorsforPROCEDURESP11_1:
LINE/COLERROR

7/1PLS00103:Encounteredthesymbol
"END"whenexpecting
oneofthefollowing:
:=.(%;
Thesymbol";"wassubstituted
for"END"tocontinue.

_____________________________________________________________________
FocusTrainingServices7

PLSQLNOTES

Variabledeclarationandassigningvaluetovariables.
createorreplaceproceduresp12
ThisProgramShowsThat
HowDeclaringVariables
as
l_my_namevarchar2(20):='gaurav';
CharacterVariable
l_my_agenumber:=23;
NumberVariable
begin
dbms_output.put_line('MyNameis'||l_my_name);
dbms_output.put_line('MyAgeis'||l_my_age);
end;
/
showerrors

OUTPUT:
SQL>@sp12.sql
Procedurecreated.
Noerrors.
SQL>execsp12
MyNameisgaurav
MyAgeis23
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices8

PLSQLNOTES

Passingvaluetovariables.
createorreplaceproceduresp13(l_name
varchar2,l_agenumber)
ThisProgramshowshowto
PassValuestoprocedures
Acceptvaluesinvariable
withoutspecifingitslength
as
begin
dbms_output.put_line('NameEnteredByUser:'||l_name);
dbms_output.put_line('AgeEnteredByUser:'||l_age);
end;
/
showerrors

OUTPUT:
SQL>@sp13.sql
Procedurecreated.
Noerrors.
SQL>execsp13('gaurav',22);
NameEnteredByUser:gaurav
AgeEnteredByUser:22
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices9

PLSQLNOTES

Selectingvaluesfromdatabasetables.
createorreplaceproceduresp13_1
ThisProgramsShowshowto
ExecuteSQLquriesfromplsql
as
l_employee_idnumber:=100;
l_employee_namevarchar2(30);
begin
selectlast_name
intol_employee_name
fromemployees
whereemployee_id=l_employee_id;
intoclausecopiesselectedcolumn'svalue
intogivenvariables
dbms_output.put_line('EmployeesNameis:'||
l_employee_name);
end;
/
showerrors

OUTPUT
SQL>@sp13_1.sql
Procedurecreated.
Noerrors.
SQL>execsp13_1
EmployeesNameis:King
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices10

PLSQLNOTES

Useof%typevariable.
createorreplaceproceduresp15(l_employee_idnumber)
ThisProgramshows
howtousevariableswithsamedatatypefromtables
Objective
AcceptEmployeeIDFromUser
PrintNameofThatEmployee
as
l_last_nameemployees.last_name%type;
begin
selectlast_name
intol_last_name
fromemployees
whereemployee_id=l_employee_id;
dbms_output.put_line('NameofEmployeeis:'||l_last_name);
end;
/
showerrors

SQL>@sp15
Procedurecreated.
Noerrors.
SQL>setserveroutputon
SQL>execsp15(200);
NameofEmployeeis:Whalen
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices11

PLSQLNOTES

Useof%rowtypevariable
createorreplaceproceduresp14
ThisProgramshows
howtodeclareVariablesWith%TypeAttribute
MeansSameDataTypeasinTable
as
l_last_nameemployees.last_name%type;
Inthiscasedatatypeof
l_last_nameissameas
datatypeofcolumnlast_namefromemployees
begin
selectlast_name
intol_last_name
fromemployees
whereemployee_id=101;
dbms_output.put_line(l_last_name);
end;
/
showerrors

OUTPUT:
SQL>@sp14.sql
Procedurecreated.
Noerrors.
SQL>execsp14
Kochhar
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices12

PLSQLNOTES

Scopeofvariablesinprocedure.
createorreplaceproceduresp16
ThisProgramshows
ScopeOfVariableinStoredProcedure
as
l_nonumber:=600;
l_msgvarchar2(20):='GlobalVariable';
begin
<<Inner_Block1>>
declare
l_nonumber:=1;
l_msgvarchar2(20):='Localvariable';
begin
l_no:=l_no+1;
dbms_output.put_line('InInnerBlock1');
dbms_output.put_line(l_no);
dbms_output.put_line(l_msg);
end;
<<Inner_Block2>>
declare
l_nonumber:=100;
begin
dbms_output.put_line('InInnerBlock2');
dbms_output.put_line(l_no);
dbms_output.put_line(l_msg);
end;
dbms_output.put_line('InMain');
dbms_output.put_line(l_no);
dbms_output.put_line(l_msg);
end;
/
showerrors

Variablesdeclaredinmainprocedure(Outermostvariable)are
globalvariables.

Globalvariablescanbeaccessableinallinnerprocedures.

Innerprocedurescandefinetheirownvariableswithsamename
asglobalvariableandaccess.

Butitisnotgoodprogramingpractice.
_____________________________________________________________________
FocusTrainingServices13

PLSQLNOTES

OUTPUT
SQL>@sp16.sql
Procedurecreated.
Noerrors.
SQL>execsp16
InInnerBlock2
2
LocalVariable
InInnerBlock2
100
GlobalVariable
InInnerMain
600
GlobalVariable
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices14

PLSQLNOTES

DMLStatementsinProcedure
createorreplaceproceduresp17
ThisProgramsshows
ExecutingDMLstatementinPlsql
as
begin
InsertingDataFromPlsqlProcedure
insertintotest(test_id,test_name)
values(1,'sql');
insertintotest(test_id,test_name)
values(2,'plsql');
UpdatingDataFromPlsqlProcedure
updatetest
settest_id=20
wheretest_id=2;
DeletingDataFromPlsqlProcedure
deletefromtest
wheretest_id=20;
commit;
end;
/
showerrors
OUTPUT
createtabletest(test_idnumber,test_namevarchar2(10));
Tablecreated.
SQL>@sp17.sql
Procedurecreated.
Noerrors.
SQL>execsp17
PL/SQLproceduresuccessfullycompleted.
SQL>select*fromtest;
TEST_IDTEST_NAME

1sql

_____________________________________________________________________
FocusTrainingServices15

PLSQLNOTES

ImplicitCursorsinPlsql
createorreplaceproceduresp18
ThisProgramshowshowtouse
SqlCursorAttributes(Setbydefaultbysql)
SQL%ROWCOUNT
SQL%FOUND
SQL%NOTFOUND
SQL%ISOPEN
as
begin
insertintotest(test_id,test_name)values(3,'RedHat');
ifsql%foundthen
dbms_output.put_line('Rowisinserted');
endif;
delete
fromtest;
dbms_output.put_line(sql%rowcount||'
Rowsareselected');
delete
fromtest;
ifsql%notfoundthen
dbms_output.put_line('Norowisdeleted');
endif;
end;
/
showerrors

Implicitcursorsareimplicitlydefinebyoracle.

Theyreturninformationaboutresultofquery.

SQL%ROWCOUNTreturnsnumberofrowsaffectedbyquery.

SQL%FOUNDreturntrueifatleastonerowisaffectedbyquery.

SQL%NOTFOUNDreturntrueifzerorowsareaffectedbyquery.

_____________________________________________________________________
FocusTrainingServices16

PLSQLNOTES

SQL>@sp18.sql
Procedurecreated.
Noerrors.
SQL>select*fromtest;
TEST_IDTEST_NAME

1sql
SQL>execsp18
Rowisinserted
2Rowsareselected
Norowisdeleted
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices17

PLSQLNOTES

CONTROLSTATEMENTS

_____________________________________________________________________
FocusTrainingServices18

PLSQLNOTES

ControlStatement:IfElseCondition
createorreplaceproceduresp21(p_employee_idinnumber)
as
Thisprocedurewillgiveasalaryraise
toanemployee.Rulesfortheraiseareasfollows
1.20%forEmployeesworkingwithusforatleast12years
andwhosesalaryislessthanRs.6000/
2.15%forEmployeeswhosesalarylessthanRs.6000/
3.10%foremployeesworkingwithusforatleast12years
l_hire_dateemployees.hire_date%type;
l_salaryemployees.salary%type;
l_years_of_servicenumber:=0;
l_new_salarynumber:=0;
begin
selecthire_date,
salary
intol_hire_date,
l_salary
fromemployees
whereemployee_id=p_employee_id;
l_years_of_service:=months_between(sysdate,l_hire_date)/12;
ifl_salary<6000andl_years_of_service>12then
l_new_salary:=l_salary*1.2;
dbms_output.put_line('Giving20%raise');
elsifl_salary<6000then
l_new_salary:=l_salary*1.15;
dbms_output.put_line('Giving15%raise');
elsifl_years_of_service>12then
l_new_salary:=l_salary*1.1;
dbms_output.put_line('Giving10%raise');
else
_____________________________________________________________________
FocusTrainingServices19

PLSQLNOTES

l_new_salary:=l_salary;
dbms_output.put_line('Nosalaryraise');
endif;
updateemployees
setsalary=l_new_salary
whereemployee_id=p_employee_id;
commit;
end;
/
showerrors

IFconditionTHEN

statements;

[ELSIFconditionTHEN

statements;]

[ELSE

statements;]

ENDIF;

OUTPUT
SQL>@sp21.sql
Procedurecreated.
Noerrors.
SQL>selectsalaryfromemployeeswhereemployee_id=101;
SALARY

17000
SQL>execsp21(101);
Giving10%raise
PL/SQLproceduresuccessfullycompleted.
SQL>selectsalaryfromemployeeswhereemployee_id=101;
SALARY

18700
_____________________________________________________________________
FocusTrainingServices20

PLSQLNOTES

ControlStatement:Case
createorreplaceproceduresp22(p_gradeinvarchar2)
as
CaseStatement

CASEselector
WHENexpression1THENresult1
WHENexpression2THENresult2
...
WHENexpressionNTHENresultN
[ELSEresultN+1;]
END;
ACASEexpressionselectsaresultandreturnsit
l_appraisalvarchar2(100);
begin
l_appraisal:=CASEp_grade
WHEN'A'THEN'Excellent'
WHEN'B'THEN'VeryGood'
WHEN'C'THEN'Good'
ELSE'Nosuchgrade'
END;
DBMS_OUTPUT.PUT_LINE('Grade:'||p_grade||
'Appraisal'||l_appraisal);
end;
/
showerrors

OUTPUT
SQL>@sp22.sql
Procedurecreated.
Noerrors.
SQL>execsp22('C');
Grade:CAppraisalGood
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices21

PLSQLNOTES

ControlStatements:BasicLoop
createorreplaceproceduresp23(p_loop_counterinnumber)
as
BasicLoopconstruct

LOOP
statement1;
...
EXIT[WHENcondition];
ENDLOOP;
Usethebasicloopwhenthestatementsinsidethe
loopmustexecuteatleastonce.
inumber;
begin
i:=1;
loop
dbms_output.put_line(to_char(i));
exitwheni>=p_loop_counter;
i:=i+1;
endloop;
end;
/
showerrors

Basicloopperformrepetativeactions.

Programercanuseexitconditiontoterminatetheloop.

OUTPUT
SQL>@sp23.sql
Procedurecreated.
Noerrors.
SQL>execsp23(5);
1
2
3
4
5
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices22

PLSQLNOTES

ControlStatement:WhileLoop
createorreplaceproceduresp24(p_loop_counterinnumber)
as
WhileLoopconstruct

WHILEconditionLOOP
statement1;
statement2;
...
ENDLOOP;
UsetheWHILEloopiftheconditionhastobe
evaluatedatthestartofeachiteration.
inumber;
begin
i:=1;
whilei<=p_loop_counter
loop
dbms_output.put_line(to_char(i));
i:=i+1;
endloop;
end;
/
showerrors

Whileloopperformsrepetativeactions
untilcontrolingconditionisnolongerTrue.
Theconditionischeckedatstartofeachtransaction.

OUTPUT
SQL>@sp24.sql
Procedurecreated.
Noerrors.
SQL>execsp24(5);
1
2
3
4
5
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices23

PLSQLNOTES

ControlStatement:ForLoop
createorreplaceproceduresp25(p_loop_counterinnumber)
as
ForLoopconstruct

FORcounterIN[REVERSE]
lower_bound..upper_boundLOOP
...
ENDLOOP;
UseaFORloopifthenumberofiterationsisknown.
inumber;
begin
Namingaloopisoptional
<<my_for_loop>>
foriin1..p_loop_counter
loop
sp5(to_char(i),2);
endloopmy_for_loop;
dbms_output.put_line('');
nowthereverseforloop
foriinreverse1..p_loop_counter
loop
dbms_output.put_line(to_char(i));
endloop;
end;
/
showerrors
OUTPUT
SQL>@sp25.sql
Procedurecreated.
Noerrors.
SQL>execsp25(3);
1
2
3

3
2
1
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices24

PLSQLNOTES

InfiniteLoop
createorreplaceproceduresp54
as
Howtowriteaninfiniteloop
begin

while(999=999)
loop
dbms_output.put_line('Hi');
endloop;

while(true)
loop
dbms_output.put_line('Hi');
endloop;
end;
/
showerrors

Asprogramerdidnotmentionedexitcondition,

Proramwillrepeatprintinginfinitelly.

Thisisbadprogramming.

_____________________________________________________________________
FocusTrainingServices25

PLSQLNOTES

COMPOSITEVARIABLES

_____________________________________________________________________
FocusTrainingServices26

PLSQLNOTES

CompositeVariable:Records
createorreplaceproceduresp31
Thisprogramshowshowto
createcompositedatatypes
FirstCompositedatatypeisrecord
as
TYPEemp_sal_recordisRECORD
(last_namevarchar2(20),
salarynumber(10));
emp_salemp_sal_record;
emp_sal_recordcanstore
last_nameandsalaryofemployee
insinglevariable
begin
selectlast_name,salary
intoemp_sal
fromemployees
whereemployee_id=100;
dbms_output.put_line('EmployeeName:'||emp_sal.last_name);
dbms_output.put_line('EmployeesSalary:'||emp_sal.salary);
end;
/
showerrors

CompositeDatatypeRecordsstoresmorethanonedatatypeunder
singlerecord.

OUTPUT:
SQL>@sp31.sql
Procedurecreated.
Noerrors.
SQL>setserveroutputon
SQL>execsp31
EmployeeName:King
EmployeesSalary:24000
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices27

PLSQLNOTES

CompositeDatatype:%rowtype
createorreplaceproceduresp32
Thisprogramshowshowto
createcompositedatatypes
Secondcompositedatatypeis%rowtype
as
emp_recordemployees%rowtype;
emp_recordstores
allvaluesofallcolumns
fromemployeestable
begin
select*
intoemp_record
fromemployees
whereemployee_id=100;
dbms_output.put_line('Name:'||emp_record.last_name);
dbms_output.put_line('DepartmentId:'||
emp_record.department_id);
end;
/
showerrors

%rowtypevariableisusedtostoreallcolumndatatypesin
singlevariable.

OUTPUT:
SQL>@sp32.sql
Procedurecreated.
Noerrors.
SQL>setserveroutputon
SQL>execsp32
Name:King
DepartmentId:90
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices28

PLSQLNOTES

Compositedatatype:Indexbytable
createorreplaceproceduresp33
Thisprogramshowshowto
createcompositedatatypes
ThirdcompositedatatypeisIndexbytable
Thisvariableprovidearraylikeaccesstorows
as
TYPEemp_typeISTABLEOF
employees%rowtype
indexbybinary_integer;
emp_arrayemp_type;
begin
foriin101..104
loop
select*
intoemp_array(i)
fromemployees
whereemployee_id=i;
endloop;
foriinemp_array.FIRST..emp_array.LAST
loop
dbms_output.put_line(emp_array(i).first_name||
''||emp_array(i).last_name);
endloop;
end;
/
showerrors

OUTPUT
SQL>@sp33.sql
Procedurecreated.
Noerrors.
SQL>execsp33
NeenaKochhar
LexDeHaan
AlexanderHunold
BruceErnst
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices29

PLSQLNOTES

CompositeDataType:VariableArray
createorreplaceproceduresp34
Thisprogramshowshowto
Compositedatatype
FourthcompositevariableisVarray
as
typearrisvarray(4)ofregions.region_name%type;
Declarationofvariablearraywitharrayelements=4
arr_1arr;
Initializationofarraycreateemptyarray
l_region_nameregions.region_name%type;
begin
arr_1:=arr();
foriin1..4loop
arr_1.extend(1);
Extendmethodtodefineextracells
selectregion_name
intol_region_name
fromregions
whereregion_id=i;
arr_1(i):=l_region_name;
endloop;
dbms_output.put_line(arr_1.count());
dbms_output.put_line(arr_1(1));
end;
/
showerrors

Thisdatatypeisusefulwhenuserknowsexactlengthforarray
declaration.

OUTPUT
SQL>@sp34.sql
Procedurecreated.
Noerrors.
SQL>execsp34
4
Europe
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices30

PLSQLNOTES

EXPLICITCURSORS

_____________________________________________________________________
FocusTrainingServices31

PLSQLNOTES

ExplicitCursors
createorreplaceproceduresp61
ThisProgramshows
Howtowriteexplicitcursor
Howtoopencursor
Howtofetchdatafromcursor
Howtoclosecursor
as
cursorc1isselectlast_name,salary
fromemployees
wheredepartment_id=20;
Declarationofcursor
l_emp_nameemployees.last_name%type;
l_salemployees.salary%type;
begin
openc1;
OpeningofaCursor
loop
fetchc1intol_emp_name,l_sal;
exitwhenc1%notfound;
FetchingDatafromCursor
dbms_output.put_line(l_emp_name||''||
to_char(l_sal));
endloop;
closec1;
ClosingofCursor
end;
/
showerrors

ForeverySQLstatementexecution,certainareainmemoryis
allocated.
Programercangivenametothatareaandasknownascursor.
Usingcursor,fetchedrowscanbeprocessonebyone.

_____________________________________________________________________
FocusTrainingServices32

PLSQLNOTES

OUTPUT
SQL>!visp61.sql
SQL>@sp61.sql
Procedurecreated.
Noerrors.
SQL>execsp61
Hartstein13000
Fay6000
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices33

PLSQLNOTES

Explicitcursor:FetchingDataintorecords
createorreplaceproceduresp62
ThisProgramshows
Howtofetchdatafromcursorintorecords
as
cursorc1isselect*
fromemployees
wheredepartment_id=50;
CursorDeclaration
rec_c1c1%rowtype;
RecordDeclaration
begin
openc1;
loop
fetchc1intorec_c1;
exitwhenc1%notfound;
FetchingDatafromcursorintorecord
dbms_output.put_line('Name:'||
rec_c1.last_name);
dbms_output.put_line('Salary:'||
rec_c1.salary);
endloop;
closec1;
end;
/
showerrors

OUTPUT
SQL>@sp62.sql
Procedurecreated.
Noerrors.
SQL>execsp62
Name:Hartstein
Salary:13000
Name:Fay
Salary:6000
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices34

PLSQLNOTES

ExplicitCursor:UseofForLoop
createorreplaceproceduresp63
ThisProgramshows
CursorForLoop
as
cursorc1isselect*
fromemployees
wheredepartment_id=20;
begin
forrec_c1inc1loop
ImplicitOpenandFetchoccurs
dbms_output.put_line('Name:'||rec_c1.last_name);
dbms_output.put_line('salary:'||
to_char(rec_c1.last_name));
endloop;
end;
/
showerrors

OUTPUT:
SQL>@sp63.sql
Procedurecreated.
Noerrors.
SQL>execsp63
Name:Hartstein
salary:Hartstein
Name:Fay
salary:Fay
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices35

PLSQLNOTES

ExplicitCursor:Subqueries
createorreplaceproceduresp64
ThisProgramshows
Cursorforloopusingsubqueries
as
l_last_namevarchar2(30);
begin
forl_last_namein(selectlast_namefromemployeeswhere
department_id=20)loop
dbms_output.put_line('Name:'||l_last_name);
endloop;
end;
/
showerrors

OUTPUT:
SQL>@sp64.sql
Procedurecreated.
Noerrors.
SQL>execsp64
Name:Hartstein
Salary:13000
Name:Fay
Salary:6000
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices36

PLSQLNOTES

ExplicitCursor:Passingparameterstocursors
createorreplaceproceduresp65(deptnonumber,jobvarchar2)
ThisProgramshows
Howtopassparameterstocursor
as
cursorc1(l_deptnonumber,l_jobvarchar2)is
selectemployee_id,last_name
fromemployees
wheredepartment_id=l_deptno
andjob_id=l_job;
rec_c1c1%rowtype;
Declarationofcursor
begin
forrec_c1inc1(90,'AD_VP')loop
PassingParamenterstocursor
dbms_output.put_line('Depatment80'||'Job
idisSA_MAN');
dbms_output.put_line('EmployeeID:'||
to_char(rec_c1.employee_id));
dbms_output.put_line('EmployeeName:'||
rec_c1.last_name);
endloop;
openc1(deptno,job);
PassingParamenterstocursor
loop
fetchc1intorec_c1;
exitwhenc1%notfound;
dbms_output.put_line(deptno||'Jobidis'||
job);
dbms_output.put_line('EmployeeID:'||
to_char(rec_c1.employee_id));
dbms_output.put_line('EmployeeName:'||
rec_c1.last_name);
endloop;
closec1;
end;
/
showerrors
_____________________________________________________________________
FocusTrainingServices37

PLSQLNOTES

SQL>@sp65.sql
Procedurecreated.
Noerrors.
SQL>execsp65(60,'IT_PROG');
Depatment80JobidisSA_MAN
EmployeeID:101
EmployeeName:Kochhar
Depatment80JobidisSA_MAN
EmployeeID:102
EmployeeName:DeHaan
60JobidisIT_PROG
EmployeeID:103
EmployeeName:Hunold
60JobidisIT_PROG
EmployeeID:104
EmployeeName:Ernst
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices38

PLSQLNOTES

ExplicitCursor:UpdateClause
createorreplaceproceduresp66
ThisProgramshows
TheForUpdateClauseincursor
as
cursorc1is
select*
fromemployees
wheredepartment_id=20
forupdateofsalarynowait;
rec_c1c1%rowtype;
l_new_salnumber;
begin
dbms_output.put_line(rpad('Employee',10)||
rpad('OldSalary',10)||
rpad('NewSalary',10));
openc1;
loop
fetchc1intorec_c1;
exitwhenc1%notfound;
ifrec_c1.salary<7000then
l_new_sal:=rec_c1.salary*1.25;
updateemployeessetsalary=l_new_sal
whereemployee_id=rec_c1.employee_id;
else
l_new_sal:=rec_c1.salary*1.15;
updateemployeessetsalary=l_new_sal
whereemployee_id=rec_c1.employee_id;
endif;
dbms_output.put_line
(rpad(rec_c1.last_name,10)||
rpad(rec_c1.salary,10)||
rpad(l_new_sal,10));
endloop;
closec1;
end;
/
showerrors

_____________________________________________________________________
FocusTrainingServices39

PLSQLNOTES

Programercanlockrows

Beforeperforminganyupdateordeleteusingcursor.

Whilecursorisopennoonecanaccessselectedrows.

SQL>@sp66.sql
Procedurecreated.
Noerrors.
SQL>execsp66
EmployeeOldSalaryNewSalary
Hartstein19771.3822737.087
Fay9918.7511406.5625
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices40

PLSQLNOTES

ExplicitCursor:Wherecurrentofclause
createorreplaceproceduresp67
ThisProgramshows
Theuseofwherecurrentofclause
as
cursorc1is
selectemployee_id,salary
fromemployees
wheredepartment_id=20
forupdateofsalarynowait;
l_new_salnumber;
rec_c1c1%rowtype;
begin
dbms_output.put_line(rpad('Employee',10)||
rpad('OldSalary',10)||
rpad('NewSalary',10));
openc1;
loop
fetchc1intorec_c1;
exitwhenc1%notfound;
ifrec_c1.salary<7000then
l_new_sal:=rec_c1.salary*1.25;
updateemployeessetsalary=
l_new_sal
wherecurrentofc1;
else
l_new_sal:=rec_c1.salary*1.25;
updateemployeessetsalary=
l_new_sal
wherecurrentofc1;
endif;
endloop;
closec1;
dbms_output.put_line(rpad(rec_c1.employee_id,10)||
rpad(rec_c1.salary,10)||
rpad(l_new_sal,10));
end;
/
showerrors
_____________________________________________________________________
FocusTrainingServices41

PLSQLNOTES

Programercanupdateordelete

onlycurrentrowincursorbydefining

'wherecurrentofclause'

SQL>@sp67.sql
Procedurecreated.
Noerrors.
SQL>execsp67
EmployeeOldSalaryNewSalary
20211406.5614258.2
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices42

PLSQLNOTES

EXCEPTIONS

_____________________________________________________________________
FocusTrainingServices43

PLSQLNOTES

Exceptions:PredefinedExceptions
createorreplaceproceduresp81
ThisProgramshows
HowtohandlePredefineexceptions
as
l_last_nameemployees.last_name%type;
begin
selectlast_name
intol_last_name
fromemployees
whereemployee_id=99999;

dbms_output.put_line(l_last_name);

exception
whenno_data_foundthen
No_data_foundisoneofpredefinedexception
dbms_output.put_line('EmployeeNotexist');
end;
/
showerrors

_____________________________________________________________________
FocusTrainingServices44

PLSQLNOTES

Exceptionisakindoferrorthatturminatesuser'sprogram
executionexample'divideby0'.

Oraclehasdefinedapproximately20errorsoccurmostoften.

Knownas'PredefineExceptions'.

OUTPUT
SQL>@sp81.sql
Procedurecreated.
Noerrors.
SQL>execsp82
EmployeeNotexist
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices45

PLSQLNOTES

Exceptions:NonPredefinedExceptions
createorreplaceproceduresp82
Thisprogramshows
Howtohandlenonpredefineexceptions
as
duplicate_keyexception;
PRAGMAEXCEPTION_INIT
(duplicate_key,00001);
begin
insertintodepartmentsvalues(20,'New
Department',200,1800);
commit;
exception
whenduplicate_keythen
dbms_output.put_line('Cannotinsertduplicate
department,departmentalreadyexist');
end;
/
showerrors

NonPredefineexceptionsaredefinedbyoracleserver,
buthasnoname.

UsePragmaexceptiontogivenametorespectiveexception.

SQL>@sp82.sql
Procedurecreated.
Noerrors.
SQL>setserveroutputon
SQL>execsp82
Cannotinsertduplicatedepartment,departmentalreadyexist
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices46

PLSQLNOTES

Exceptions:Others
createorreplaceproceduresp83
as
begin
deletefromdepartments
wheredepartment_id=20;
exceptionwhenothersthen
dbms_output.put_line('InException');
dbms_output.put_line(SQLCODE||SQLERRM);
end;
/
showerrors
ExceptionOthersisusedwhenprogramerdoesnotknow
theoraclenumberassociatedwitherror.

Programercanfinderrorassociatednumberanderrormessage
usingSQLCODE,SQLERRM

OUTPUT
SQL>@sp83.sql
Procedurecreated.
Noerrors.
SQL>execsp83
InException
2292ORA02292:integrityconstraint(HR.EMP_DEPT_FK)violated
childrecord
found
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices47

PLSQLNOTES

Exceptions:UserDefinedExceptions
createorreplaceproceduresp84
as
l_last_nameemployees.last_name%type;
l_salaryemployees.salary%type;
l_new_salfloat;
invalid_raiseexception;
begin
selectlast_name,salary
intol_last_name,l_salary
fromemployees
whereemployee_id=100;
l_new_sal:=l_salary*1.20;
ifl_new_sal>2000then
raiseinvalid_raise;
endif;
exceptionwheninvalid_raisethen
dbms_output.put_line('NotApplicableSalaryraise');
end;
/
showerrors

Programercanintroduceerrorsoncertainconditions.

Thoseerrorsareknownasuserdefineexception.

OUTPUTSQL>@sp84.sql
Procedurecreated.
Noerrors.
SQL>execsp84
NotApplicableSalaryraise
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices48

PLSQLNOTES

Exceptions:RaiseApplicationErrors
createorreplaceproceduresp85
as
l_last_nameemployees.last_name%type;
l_salaryemployees.salary%type;
l_new_salfloat;
new_exceptionexception;
PRAGMAEXCEPTION_INIT(new_exception,20999);
begin
selectlast_name,salary
intol_last_name,l_salary
fromemployees
whereemployee_id=100;
l_new_sal:=l_salary*1.20;
ifl_new_sal>2000then
raise_application_error(20999,'Thisisnotvalid
salaryincrease');
endif;
exceptionwhennew_exceptionthen
dbms_output.put_line('inexception');
dbms_output.put_line(SQLCODE||SQLERRM);
end;
/
showerrors
Programercanissueuserdefineerrormessages
using'raise_application_error'procedure.
Progrmercanassignerrorcodeanderrormessage
fornewexceptions.
Errorcodeshouldbegreaterthan20,000.
OUTPUT
SQL>@sp85.sql
Procedurecreated.
Noerrors.
SQL>execsp85
inexception
20999ORA20999:Thisisnotvalidsalaryincrease
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices49

PLSQLNOTES

Exception:FlowthroughProcedures
createorreplaceproceduresp86(l_employee_idnumber)
Thisprogramshows
Howexceptionhandlingpassesfromoneproceduretoother
as
l_salarynumber;
l_last_namevarchar2(30);
begin
dbms_output.put_line('InouterBlock');
selectsalary
intol_salary
fromemployees
whereemployee_id=l_employee_id;
begin
dbms_output.put_line('InInnerBlock');
selectlast_name
intol_last_name
fromemployees;
end;
exception
whenno_data_foundthen
dbms_output.put_line('Nodatafound');
whentoo_many_rowsthen
dbms_output.put_line('toomanyrows');
end;
/
showerrors

_____________________________________________________________________
FocusTrainingServices50

PLSQLNOTES

OUTPUT
SQL>@sp86.sql
Procedurecreated.
Noerrors.
SQL>execsp86(100);
InouterBlock
InInnerBlock
toomanyrows
PL/SQLproceduresuccessfullycompleted.
SQL>execsp86(1111);
InouterBlock
Nodatafound
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices51

PLSQLNOTES

PROCEDURES

_____________________________________________________________________
FocusTrainingServices52

PLSQLNOTES

Procedures:IN,OUTparameters
createorreplaceproceduresp91(l_emp_idinnumber,
l_salaryoutnumber)
ThisProgramsshows
Howtousein,outparameter
as
begin
selectsalary
intol_salary
fromemployees
whereemployee_id=l_emp_id;
end;
/
showerrors
createorreplaceproceduresp92
as
salarynumber;
begin
sp91(100,salary);
salaryusedasoutparameterinsp91
dbms_output.put_line(salary);
end;
/
showerrors

Inparameterusedtopassvaluetoprocedure.

Outparameterisusedtopassvaluefromparameter.
OUTPUT
SQL>@sp91.sql
Procedurecreated.
Noerrors.
SQL>@sp92.sql
Procedurecreated.
Noerrors.
SQL>execsp92
24000
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices53

PLSQLNOTES

Procedures:INOUTParameters
createorreplaceproceduresp93
Thisprogramshows
Howtouseinoutparameter
as
p_phone_novarchar2(20);
begin
p_phone_no:='1234567890';
sp94(p_phone_no);
dbms_output.put_line(p_phone_no);
end;
/
showerrors
createorreplaceproceduresp94
(p_phone_noINOUTvarchar2)
is
begin
p_phone_no:='('||substr(p_phone_no,1,3)||
')'||''||substr(p_phone_no,4,3)||
''||substr(p_phone_no,7);
end;
/
showerrors

INOUTparameterusedtopassvaluetoprocedureandreturnsome
valueinthesamevariable.
i.e.Programerneedonly1variable.
OUTPUT
SQL>@sp94.sql
Procedurecreated.
Noerrors.
SQL>@sp93.sql
Procedurecreated.
Noerrors.
SQL>execsp93
(123)4567890
PL/SQLproceduresuccessfullycompleted.
_____________________________________________________________________
FocusTrainingServices54

PLSQLNOTES

FUNCTIONS

_____________________________________________________________________
FocusTrainingServices55

PLSQLNOTES

Functions
createorreplacefunctionget_dept_name(dept_no
departments.department_id%type)
returnvarchar2
Thisprogramshows
Howtowriteuserdefinefunctions
is
l_dept_namedepartments.department_name%type;
begin
selectdepartment_name
intol_dept_name
fromdepartments
wheredepartment_id=dept_no;
returnl_dept_name;
end;
/
showerrors

Functionsareusedwhenonetaskisexecutedrepeatedly.

Functionsaresimilartoprocedures.

Functionsalwaysreturnssomevaluetocallie.

Afterfunctionsarecreated,
theycanbecalledfromsqlqueryalso.

_____________________________________________________________________
FocusTrainingServices56

PLSQLNOTES

OUTPUT
SQL>@sp10_1.sql
Functioncreated.
Noerrors.
SQL>selectlast_name,department_name
2fromemployeese,departmentsd
3wheree.department_id=d.department_id
4andemployee_id=100;
LAST_NAMEDEPARTMENT_NAME

KingExecutive
SQL>selectlast_name,get_dept_name(department_id)
2fromemployees
3whereemployee_id=100;
LAST_NAMEGET_DEPT_NAME(DEPARTMENT_ID)

KingExecutive

_____________________________________________________________________
FocusTrainingServices57

PLSQLNOTES

PACKAGES

_____________________________________________________________________
FocusTrainingServices58

PLSQLNOTES

Packages
createorreplacepackagecalculatoras
ThisProgramsshowspackagedeclaration/specification
Howtocreatepackagewithpublicprocedures
procedureadd(no1number,no2number);
proceduresubtract(no1number,no2number);
endcalculator;
/
showerrors

Packageusetogrouprelatedprocedurestogether.

InPackagedeclarationdeclarenamesofproceduresandglobal
variables.

InPackagebodywritecodeforthoseprocedures.

createorreplacepackagebodycalculatoris
ThisProgramshows
Howtodeclarebodyofpackage
procedureadd(no1number,no2number)
is
begin
dbms_output.put_line('Additionis:'||to_char(no1+
no2));
endadd;
proceduresubtract(no1number,no2number)
is
begin
dbms_output.put_line('Subtractionis:'||to_char(no1
no2));
endsubtract;
endcalculator;
/
showerrors
_____________________________________________________________________
FocusTrainingServices59

PLSQLNOTES

SQL>@cal_pac.sql
Packagecreated.
Noerrors.
SQL>@cal.sql
Packagebodycreated.
Noerrors.
SQL>execcalculator.add(20,30);
Additionis:50
PL/SQLproceduresuccessfullycompleted.
SQL>execcalculator.subtract(30,40);
Subtractionis:10
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices60

PLSQLNOTES

Package
createorreplacepackagecalculatoras
ThisProgramsshows
Howtocreatepackagewithpublicprocedures
Howtodefineglobalvariableswithdefaultvalues
Howtodefinepublicfunctions

count_addnumber:=0;
count_subtractnumber:=0;

procedureadd(no1number,no2number);
proceduresubtract(no1number,no2number);

functionget_add_countreturnnumber;
functionget_subtract_countreturnnumber;

endcalculator;
/
showerrors

_____________________________________________________________________
FocusTrainingServices61

PLSQLNOTES

createorreplacepackagebodycalculatoris
ThisProgramshows
Howtodefineprivateproceduresinpackagebody
procedureprint(textvarchar2);
functionget_add_countreturnnumber
as
begin
returncount_add;
endget_add_count;
functionget_subtract_countreturnnumber
as
begin
returncount_subtract;
endget_subtract_count;
procedureadd(no1number,no2number)
is
begin
count_add:=count_add+1;
print('Additionis:'||to_char(no1+no2));
endadd;
proceduresubtract(no1number,no2number)
is
begin
count_subtract:=count_subtract+1;
print('Subtractionis:'||to_char(no1no2));
endsubtract;
procedureprint(textvarchar2)
is
begin
dbms_output.put_line(text);
endprint;
endcalculator;
/
showerrors
_____________________________________________________________________
FocusTrainingServices62

PLSQLNOTES

SQL>@cal1.sql
Packagebodycreated.
Noerrors.
SQL>!vimcal1.sql
SQL>@cal_pac1.sql
Packagecreated.
Noerrors.
SQL>@cal1.sql
Packagebodycreated.
Noerrors.
SQL>execcalculator.add(5,2);
Additionis:7
PL/SQLproceduresuccessfullycompleted.
SQL>execcalculator.subtract(10,5);
Subtractionis:5
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices63

PLSQLNOTES

Package:ProcedureOverloading
createorreplacepackagecalculator1as
ThisProgramsshows
Howtocreatepackagewithpublicprocedures
AndProcedureoverloading
procedureadd(no1number,no2number);
procedureadd(no1varchar2,no2varchar2);
procedureadd(no1number,no2number,no3number);

endcalculator1;
/
showerrors

_____________________________________________________________________
FocusTrainingServices64

PLSQLNOTES

createorreplacepackagebodycalculator1is
procedureadd(no1number,no2number)
is
begin
dbms_output.put_line('Additionis:'||to_char(no1+
no2));
endadd;
procedureadd(no1varchar2,no2varchar2)
is
begin
dbms_output.put_line('Concatinationis:'||no1||
no2);
endadd;
procedureadd(no1number,no2number,no3number)
is
begin
dbms_output.put_line('Subtractionis:'||to_char(no1
+no2+no3));
endadd;
endcalculator1;
/
showerrors

ProcedureOverloadingmeansdefiningprocedurewith
samenamebutwithdifferentparameters,datatypes.

Inabovepackageprocedureaddisoverloaded.

_____________________________________________________________________
FocusTrainingServices65

PLSQLNOTES

SQL>execcalculator1.add(10,20);
Additionis:30
PL/SQLproceduresuccessfullycompleted.
SQL>execcalculator1.add('scott','tiger');
Concatinationis:scotttiger
PL/SQLproceduresuccessfullycompleted.
SQL>execcalculator1.add(10,20,30);
Additionis:60
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices66

PLSQLNOTES

ORACLEPACKAGES

_____________________________________________________________________
FocusTrainingServices67

PLSQLNOTES

DefaultPackages:UTL_FILE
createorreplaceproceduresp11_1
ThisProgramshows
HowtosendmailsusingUTL_MAILpackage
as
ora_nonumber;
ora_msgvarchar2(100);
begin
UTL_MAIL.SEND
(sender=>'gaurav@server1.example.com',
recipients=>'gaurav@server1.example.com',
cc=>'mithilesh@server1.example.com',
bcc=>'krunal@server1.example.com',
subject=>'testmail',
message=>'hihowru??'
);
dbms_output.put_line('Messagesendsuccessfully');
exceptionwhenothersthen
ora_no:=sqlcode;
ora_msg:=sqlerrm;
dbms_output.put_line('Messagenotsend');
dbms_output.put_line(ora_no||''||ora_msg);
end;
/
showerrors

_____________________________________________________________________
FocusTrainingServices68

PLSQLNOTES

OUTPUT
SQL>@sp11_1.sql
Procedurecreated.
Noerrors.
SQL>execsp11_1
Messagesendsuccessfully
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices69

PLSQLNOTES

DefaultPackages:UTL_FILE
createorreplaceproceduresp11_2
Thisprogramsshow
Howtoreaddatafromtextfile
usingUTL_FILEPackage
as
v_dirvarchar2(200);
SpecifyDirectorynameandpath
v_file_namevarchar2(100);
SpecifyFileName
v_linevarchar2(500)
Acceptfilelinebylineinthisvariable
v_fileUTL_FILE.FILE_TYPE;
FileHandler
begin
v_dir:='/home/gaurav/plsql/';
v_file_name:='utl_file.txt';
v_file:=
UTL_FILE.FOPEN(v_dir,v_file_name,'r');
FileOpeninreadonlymode
loop
begin
UTL_FILE.GET_LINE(v_file,v_line);
exception
whenno_data_foundthen
exit;
end;
dbms_output.put_line(v_line);
endloop;
end;
/
showerrors

_____________________________________________________________________
FocusTrainingServices70

PLSQLNOTES

OUTPUT
[gaurav@server1plsql]$catutl_file.txt
hello
howru??
gaurav
OUTPUT
SQL>!vimsp11_2.sql

SQL>@sp11_2.sql

Procedurecreated.
Noerrors.
SQL>execsp11_2
hello
howru??
gaurav

PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices71

PLSQLNOTES

DefaultPackages:DBMS_SCHEDULER
createorreplaceproceduresp11_6
Thisprocedureshows
Howtousedefaultpackage
DBMS_SCHEDULERtoschedulesometask
as
orr_codenumber;
orr_msgvarchar2(500);
begin
create_jobisinbuildprocedureinDBMS_SCHEDULER
DBMS_SCHEDULER.CREATE_JOB(
job_name=>'update_sales',
job_type=>'STORED_PROCEDURE',
job_action=>'sp11_4',
start_date=>'20APR1003.10.00.000000000PM
ASIA/CALCUTTA',
repeat_interval=>'FREQ=SECONDLY;INTERVAL=10',
end_date=>'20APR1003.11.00.000000000PM
ASIA/CALCUTTA',
comments=>'Mynewjob');
exceptionwhenothersthen
orr_code:=sqlcode;
orr_msg:=sqlerrm;
dbms_output.put_line(orr_code||''||orr_msg);
end;
/
showerrors

_____________________________________________________________________
FocusTrainingServices72

PLSQLNOTES

OUTPUT
15:04:48SQL>truncatetabletest_sch;
Tabletruncated.
15:04:57SQL>@sp11_6.sql
Procedurecreated.
Noerrors.
15:05:01SQL>execsp11_6
PL/SQLproceduresuccessfullycompleted.
15:05:06SQL>exec
dbms_scheduler.set_scheduler_attribute('MAX_JOB_SLAVE_PROCESSES',
2);
requiresmanageschedulerprivilege
PL/SQLproceduresuccessfullycompleted.
15:05:22SQL>execdbms_scheduler.enable('update_sales');
enablethejob
PL/SQLproceduresuccessfullycompleted.
15:05:43SQL>select*fromtest_sch;
norowsselected
15:07:31SQL>selectcount(*)fromtest_sch;
COUNT(*)

0
15:09:41SQL>/
COUNT(*)

100

_____________________________________________________________________
FocusTrainingServices73

PLSQLNOTES

15:10:04SQL>/
COUNT(*)

200
15:10:14SQL>/
COUNT(*)

300
15:10:27SQL>/
COUNT(*)

400
15:10:37SQL>/
COUNT(*)

500
15:10:46SQL>/
COUNT(*)

600
15:10:53SQL>/
COUNT(*)

600

_____________________________________________________________________
FocusTrainingServices74

PLSQLNOTES

DYNAMICSQL

_____________________________________________________________________
FocusTrainingServices75

PLSQLNOTES

DynamicSql
createorreplaceproceduresp12_1(l_table_namevarchar2)
Thisprogramshows
Howtobuilddynamicsqlqueries.
as
sql_queryvarchar2(50);
l_countnumber;
begin
sql_query:='selectcount(*)from'||l_table_name;
executeimmediatesql_queryintol_count;
Writesqlcommandinavarchar2variable
Andthenusecommand'executeimmediate'
Acceptreturingvalueinappropriatevariable
dbms_output.put_line(l_count);
end;
/
showerrors

OUTPUT
SQL>@sp12_1.sql
Procedurecreated.
Noerrors.
SQL>execsp12_1('REGIONS');
4
PL/SQLproceduresuccessfullycompleted.

_____________________________________________________________________
FocusTrainingServices76

PLSQLNOTES

TRIGGERS

_____________________________________________________________________
FocusTrainingServices77

PLSQLNOTES

Trrigers
createorreplacetriggerchk_emp_sal
Thisprogramsshows
Howtodeclaretriggers
foreachrow
beforeinsertorupdate
ofsalary
onemployees
foreachrow
declare
v_errorVARCHAR2(2000);
begin
if:new.salary>25000then
v_error:=:old.first_name||'cannothavethatmuch!';
raise_application_error(20999,v_error);
endif;
end;
/
showerrors

Oracle lets you define procedures called triggers

that run implicitly when an INSERT, UPDATE, or


DELETE statementisissuedagainsttheassociated
tableor,in somecases, againstaview,orwhen
databasesystemactionsoccur.

_____________________________________________________________________
FocusTrainingServices78

PLSQLNOTES

OUTPUT
SQL>@14_1.sql

Triggercreated.

Noerrors.
SQL>insertinto
employees(EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,SALARY)
2values(215,'Bhide','abc@gmail.com',sysdate,'IT_PROG',26000);
insertinto
employees(EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,SALARY)
*
ERRORatline1:
ORA20999:cannothavethatmuch!
ORA06512:at"HR.CHK_EMP_SAL",line7
ORA04088:errorduringexecutionoftrigger'HR.CHK_EMP_SAL'

_____________________________________________________________________
FocusTrainingServices79

PLSQLNOTES

Triggers:Updating,Inserting,Deleting
createorreplacetriggertrig_example
beforeinsertordeleteorupdateontrig_eg
foreachrow
declare
ChangeTypevarchar2(10);
begin
/*Use'I'foranINSERT,'D'forDELETE,and'U'forUPDATE.*/
ifinsertingthen
ChangeType:='I';
elsifupdatingthen
ChangeType:='U';
else
ChangeType:='D';
endif;
insertintochanges_recordvalues(ChangeType,USER,SYSDATE);
endtrig_example;
/
showerrors

_____________________________________________________________________
FocusTrainingServices80

PLSQLNOTES

OUTPUT
SQL>@sp14_2.sql
Triggercreated.
Noerrors.
SQL>select*fromCHANGES_RECORD;
norowsselected
SQL>insertintotrig_egvalues(1,'aaa');
1rowcreated.
SQL>insertintotrig_egvalues(2,'bbb');
1rowcreated.
SQL>updatetrig_egsetname='xxxx'whereid=2;
1rowupdated.
SQL>deletefromtrig_egwhereid=2;
1rowdeleted.
SQL>select*fromCHANGES_RECORD;
CHANGEUSER_NAMECHANGE_DA

IGAURAV18APR10
IGAURAV18APR10
UGAURAV18APR10
DGAURAV18APR10
SQL>select*fromtrig_eg;
IDNAME

1aaa

_____________________________________________________________________
FocusTrainingServices81

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy