Вы находитесь на странице: 1из 14

Except

ions

Anerrorcondi
ti
ondur i
ngaprogram execut
ioniscall
edanexcepti
oninPL/SQL.PL/
SQLsupport
s
programmer st
ocatchsuchconditi
onsusingEXCEPTI ONblockinthepr
ogram andanappr
opr
iat
eacti
oni
s
takenagainstt
heerrorcondi
ti
on.Ther
ear etwotypesofexcepti
ons:

Sy
stem-
def
inedex
cept
ions

User
-def
inedexcept
ions

Sy
ntaxf
orExcept
ionHandl
i
ng

TheGener
alSyntaxf
orexcepti
onhandli
ngisasfol
lows.Her
e,y
oucanli
stdownasmanyasexcept
ionsy
ou
wantt
ohandle.Thedef
aultexcept
ionwil
lbehandl
edusingWHENother
sTHEN:

DECLARE
<declarationssection>BEGI N
<executabl ecommand( s)>EXCEPTI ON
<exceptionhandl i
nggoesher e>WHENexcept ion1THEN
except i
on1-handli
ng-statementsWHENexcept i
on2THEN
except i
on2-handli
ng-statementsWHENexcept i
on3THEN
except i
on3-handli
ng-statements
..
...
..
.
WHENot hersTHENexcept ion3-
handli
ng-
stat
ements
END;
Exampl
e

Letuswri
tesomesimpl
ecodetoil
lust
ratet
heconcept
.Wewi
l
lbeusi
ngt
heCUSTOMERSt
abl
ewehad
creat
edandusedi
ntheprev
iouschapt
ers:

DECLARE
c_i
dcustomers.i
d%type:=8;c_
namecustomers.
name%type;
c_addr
customers.
address%ty
pe;
BEGIN
SELECTname, addressINTOc_name,
c_addrFROM cust
omers
WHEREi d=c_ i
d;

DBMS_ OUTPUT.PUT_LI
NE(
'Name: '
||
c_name) ;DBMS_ OUTPUT.
PUT_
LINE('
Addr
ess:
'|
|c_addr
);
EXCEPTION
WHENno_ data_
foundTHENdbms_ output.
put_l
ine('
Nosuchcust
omer!
'
);
WHENot her
sTHENdbms_ output
.put_l
ine(
'Er
ror!'
);
END;
/

Whent
heabov
ecodei
sexecut
edatSQLpr
ompt
,itpr
oducest
hef
oll
owi
ngr
esul
t:

Nosuchcust
omer
!

PL/
SQLpr
ocedur
esuccessf
ull
ycompl
eted.
Theabovepr ogr
am di spl
aysthenameandaddr essofacust
omerwhoseIDisgi
ven.Si
ncet
her
eisno
cust
omerwithIDvalue8i nourdat
abase,
theprogr
am rai
sest
her
un-
ti
meexcept
ion
NO_DATA_FOUND, whichiscaptur
edinEXCEPTIONblock.
Rai
si
ngExcept
ions

Excepti
onsarerai
sedbyt hedatabaseser
verautomat
ical
l
ywhenevert
her
eisanyi
nter
naldat
abaseerr
or,but
excepti
onscanber ai
sedexpli
citl
ybytheprogr
ammerbyusingthecommandRAISE.Fol
l
owingisthesi
mpl e
syntaxofr
aisi
nganex cept
ion:

DECLARE
excepti
on_nameEXCEPTION;BEGIN
IFcondit
ionTHEN
RAI
SEexcepti
on_name;ENDIF;
EXCEPTION
WHENexcepti
on_nameTHENst at
ement
;
END;

Youcanuseabov
esynt
axinr ai
singOracl
estandardexcept
ionoranyuser
-def
inedexcept
ion.Nextsect
ionwil
l
gi
veyouanexampleonrai
singuser-def
inedexcepti
on,si
milarwayyoucanraiseOracl
estandardexcept
ions
aswell
.

User
-def
inedExcept
ions
PL/SQLallowsyoutodefineyourownexcept
ionsaccordingtotheneedofy
ourprogr
am.Auser
-def
ined
except
ionmustbedecl ar
edandt henrai
sedexpli
cit
ly,usingei
theraRAI
SEstat
ementort
heprocedure
DBMS_ STANDARD.
RAISE_APPLICATI
ON_
ERROR.

Thesy
ntaxf
ordecl
ari
nganexcept
ioni
s:

DECLARE
my-except
ionEXCEPTI
ON;

Exampl
e:
Thef
oll
owi
ngexampleil
l
ustr
atestheconcept
.Thi
spr
ogr
am asksf
oracust
omerI
D,whent
heuserent
ersan
i
nval
i
dID,t
heexcept
ioni
nval
id_i
disrai
sed.

DECLARE
c_i
dcustomers.
id%type:=&cc_i
d;c_
namecust
omer
s.name%t
ype;
c_addrcust
omers.addr
ess%type;

--userdef
inedexcepti
onex_ i
nval
i
d_i
dEXCEPTION;
BEGIN
IFc_id<=0THEN
RAISEex_i
nval
id_i
d; ELSE
SELECTname, addressINTOc_name,
c_addrFROM cust
omer
s
WHEREi d=c_id;

DBMS_OUTPUT.PUT_LI
NE(
'Name:
'|
|c_
name)
;DBMS_
OUTPUT.
PUT_
LINE
('
Addr
ess:
'||
c_addr
);
ENDIF;
EXCEPTI
ON
WHENex_i
nvali
d_i
dTHEN
dbms_
output.
put_
li
ne(
'IDmustbegr
eat
erthanzer
o!'
);WHENno_dat
a_f
oundTHEN
dbms_
output.
put_
li
ne(
'Nosuchcust
omer!
'
);WHENot her
sTHEN
dbms_
output.
put
_li
ne(
'Err
or!
'
);
END;
/

Whent
heabov
ecodei
sexecut
edatSQLpr
ompt
,itpr
oducest
hef
oll
owi
ngr
esul
t:

Ent
erv
alueforcc_i
d:-6(l
et'
sent
eraval
ue-6)ol
d2: c_i
dcustomers.
id%t
ype:
=&cc_
id;
new2:c_
idcustomers.i
d%type:
=-6;
IDmustbegreaterthanzer
o!

PL/
SQLpr
ocedur
esuccessf
ull
ycompl
eted.

Pr
e-def
inedExcept
ions
PL/ SQLpr ovi
desmanypr e-
defi
nedexcepti
ons,whi
chareexecutedwhenanydat abaser
ulei
sviol
atedbya
progr am.Forexample,t
hepredefi
nedexcept
ionNO_DATA_FOUNDi srai
sedwhenaSELECTI NTOstatement
returnsnor ows.Thefol
lowi
ngtablel
ist
sfewoftheimpor
tantpre-
defi
nedexcept
ions:

SQL
Or
acl
e COD
Except
ion E Descr
ipt
ion
Er
ror

I
tisrai
sedwhenanul
l
obj
ectis
-
ACCESS_
INTO_
N 653
ULL 06530 0 automatical
l
y
assignedavalue.

I
tisrai
sedwhennone
ofthechoi
cesi
nthe
- WHENclausesofa
CASE_
NOT_
FOUN 659 CASEst
atementis
D 06592 2
select
ed,
andt her
eisnoELSE
clause.

Iti
sraisedwhena
program at
temptsto
apply
coll
ectionmethods
otherthanEXISTSto
an
- uniniti
ali
zednest
ed
COLLECTI
ON_
IS_ 653 tableorv ar
ray
,orthe
NULL 06531 1 program
at tempt stoassi
gn
v aluestot he
el ement s
ofan
uni nit
ial
i
zednested
tabl eorvarray
.

I
tisrai
sedwhen
dupl
i
cateval
uesar
e
DUP_VAL_
ON_
IN
DEX 00001 -
1 at
temptedto
bestoredinacolumn
withuniquei
ndex.

I
tisrai
sedwhen
at
temptsar
emadet
o
make
-
100 a
I
NVALI
D_CURSOR 01001 1 cursoroper
ati
onthat
i
snotal l
owed,such
as
closinganunopened
cursor.

Itisraisedwhent he
conv ersionofa
char acter
- st r
ingi ntoanumber
I
NVALI
D_NUMBE 172 f ai
lsbecauset he
R 01722 2 st r
ing
does
notr epresentaval
i
d
number .

I
tisr
aisedwhens
pr
ogram at
tempt
sto
l
og
-
101 onto
LOGI
N_DENI
ED 01017 7 thedatabasewit
han
inval
idusernameor
password.

Iti
srai
sedwhena
SELECTINTO
+10 stat
ement
NO_
DATA_
FOUND 01403 0
r
etur
nsnor
ows.

I
tisrai
sedwhena
dat
abasecal
li
s
i
ssued
-
101
NOT_
LOGGED_
ON 01012 2 wit
hout
bei
ngconnect
edt
o
t
hedat
abase.

I
tisraisedwhen
- PL/SQLhasan
PROGRAM_
ERRO 650 i
nternal
R 06501 1
pr
obl
em.

Iti
sraisedwhena
cursorfet
chesval
ue
i
na
-
ROWTYPE_
MISM 650
ATCH 06504 4 v
ari
abl
e
hav
ingincompat
ibl
e
dat
atype.

I
tisr
aisedwhena
membermethodi
s
-
306 i
nvoked,
but
SELF_
IS_
NULL 30625 25 theinst
anceoft
he
objectt
ypewasnot
i
niti
ali
zed.

I
tisr
aisedwhenPL/
SQLr
anout
ofmemory
0650
STORAGE_
ERROR 0 -
6500 or
memor
ywascor
rupt
ed.

Iti
srai
sedwhensSELECTI
NTO
stat
ement
0142
TOO_
MANY_
ROWS 2 -
1422 r
etur
ns
morethanoner
ow.

Iti
srai
sedwhenanar
it
hmet
ic,
0650 conver
sion,
VALUE_
ERROR 2 -
6502 tr
uncat
ion,
orsi
ze-
const
rai
nt
err
oroccur
s.

I
tisr
aisedwhenanat
tempti
s
madeto
0147
ZERO_
DIVI
DE 6 1476 di
vi
dea
numberbyzer
o.
Tr
igger
s
Tri
ggersarestoredprogr
ams,whichar
eautomat
ical
lyexecutedorfi
redwhensome
eventsoccur.Tri
gger
sare,i
nfact
,wri
tt
entobeexecutedinresponsetoanyoft
he
fol
lowingevents:

Adat
abasemani
pul
ati
on(
DML)st
atement(
DELETE,
INSERT,
orUPDATE)
.

Adat
abasedef
ini
ti
on(
DDL)st
atement(
CREATE,
ALTER,
orDROP)
.

Adat
abaseoper
ati
on(
SERVERERROR,
LOGON,
LOGOFF,
STARTUP,
orSHUTDOWN)
.

Tri
ggerscoul
dbedef
inedont
het
abl
e,v
iew,
schema,
ordat
abasewi
thwhi
cht
heev
enti
s
associ
ated.
Benef
it
sofTr
igger
s
Tr
igger
scanbewr
it
tenf
ort
hef
oll
owi
ngpur
poses:

Gener
ati
ngsomeder
ivedcol
umnv
aluesaut
omat
ical
l
y

Enf
orci
ngr
efer
ent
ial
int
egr
it
y

Ev
entl
oggi
ngandst
ori
ngi
nfor
mat
ionont
abl
eaccess

Audi
ti
ng

Sy
nchr
onousr
epl
i
cat
ionoft
abl
es

I
mposi
ngsecur
it
yaut
hor
izat
ions

Pr
event
ingi
nval
i
dtr
ansact
ions

Cr
eat
ingTr
igger
s
Thesy
ntaxf
orcr
eat
ingat
ri
ggeri
s:

CREATE[ ORREPLACE]TRI GGERtr


igger_
name
{BEFORE| AFTER| INSTEADOF}
{INSERT[OR]| UPDATE[ OR]|DELETE}[OF
col_name]
ONt able_name
[REFERENCI NGOLDASoNEW ASn][ FOR
EACHROW]
WHEN( conditi
on)DECLARE
Declar
at i
on-
statementsBEGIN
Executable-
stat
ement s
EXCEPTION
Excepti
on-
handl
i
ng-
stat
ement
s
END;

Wher
e,

CREATE[ OR REPLACE]TRIGGER t
ri
gger
_name:Cr
eat
esorr
epl
acesanexi
sti
ng
tr
iggerwi
t het
ht r
igger
_name.
{BEFORE |AFTER |I
NSTEAD OF}:Thi
s speci
fi
es when the t
ri
ggerwoul
d be
execut
ed.TheI
NSTEADOFclausei
susedforcr
eati
ngtr
iggeronaview.

{
INSERT[
OR]|
UPDATE[
OR]|
DELETE}
:Thi
sspeci
fi
est
heDMLoper
ati
on.

[
OFcol
_name]
:Thi
sspeci
fi
est
hecol
umnnamet
hatwoul
dbeupdat
ed.

[
ONt
abl
e_name]
:Thi
sspeci
fi
est
henameoft
het
abl
eassoci
atedwi
tht
het
ri
gger
.

[
REFERENCINGOLDASoNEW ASn]:Thi
sall
owsy out
oref
ernewandol
dval
ues
f
orvar
iousDMLstat
ement
s,l
i
keI
NSERT,UPDATE,
andDELETE.

[FOR EACH ROW] :Thisspeci


fi
esar ow leveltri
gger
,i.e.
,thet riggerwouldbe
executedforeachrowbeingaff
ected.Otherwisethetr
iggerwillexecutejustonce
whent heSQLstatementi
sexecuted,whi
chi scal
ledatablelev
el t
rigger.

WHEN(condi
ti
on):Thispr
ovi
desacondi
ti
onf orrowsf
orwhi
cht
het
ri
ggerwoul
d
f
ir
e.Thi
scl
auseisvali
donl
yforr
owlev
elt
riggers.
Thef
oll
owi
ngprogr
am createsarow leveltr
iggerf
ort
hecust
omerstabl
et hatwoul
dfi
re
UPDATEorDELETEoperat
ionsper
for
medont heCUSTOMERStabl
e.Thi
str
iggerwil
ldi
spl
ay
r
ence bet
weentheol
dv al
uesandnewv alues:

CREATEORREPLACETRI GGERdi splay_sal


ary
_ changesBEFOREDELETEOR
I
NSERTORUPDATEONcust omersFOREACHROW
WHEN( NEW. ID>0)DECLARE
sal_
diffnumber ;
BEGI N
sal_
diff:
=: NEW.sal
ar y-:OLD.sal
ary;dbms_out put.
put
_li
ne(
'Oldsal
ary
:'|
|
:
OLD.salary)
;dbms_ output.
put_l
ine('
Newsal ary:'
||:
NEW.salary
);
dbms_ output.
put_l
i
ne( '
Salar
ydi f
ference:
'||sal_di
ff
);
END;
/

Whent
heabov
ecodei
sexecut
edatSQLpr
ompt
,itpr
oducest
hef
oll
owi
ngr
esul
t:

Tr
iggercr
eat
ed.

Her
efol
l
owi
ngt
wopoi
ntsar
eimpor
tantandshoul
dbenot
edcar
eful
l
y:

OLDandNEW r
eferencesar
enotav
ail
abl
efort
abl
elev
elt
ri
gger
s,r
athery
oucanuset
hem f
or
r
ecor
dlev
elt
ri
ggers.

Ifyouwanttoquerythetabl
eint
hesamet ri
gger,thenyoushoul
dusetheAFTERkey wor
d,
becausetr
igger
scanquer ythet
abl
eorchangei tagai
nonlyaftert
heini
ti
alchangesare
appli
edandthetabl
eisbacki
naconsi
stentst
ate.

Abovetr
iggerhasbeenwrit
teninsuchawaythati
twil
lfi
rebefor
eanyDELETEorINSERTor
UPDATE operati
onont het abl
e,butyoucanwriteyourtri
ggeronasi ngl
eormul ti
ple
oper
ati
ons,forexampleBEFOREDELETE,whichwillf
ir
ewhenev erar
ecor
dwi l
lbedelet
ed
usi
ngDELETEoper at
iononthetabl
e.
Tr
igger
ingaTr
igger
Letusperf
orm someDMLoperat
ionsontheCUSTOMERSt
abl
e.Her
eisoneI
NSERTst
atement
,
whichwil
lcreat
eanewrecor
dinthetabl
e:

I
NSERTINTOCUSTOMERS( I
D,NAME,
AGE,
ADDRESS,
SALARY)
VALUES(
7,'
Kri
ti
'
,22,
'HP'
,7500.
00);

Whenarecor
discreatedinCUSTOMERStabl
e,abov
ecr
eat
etr
iggerdi
spl
ay_
sal
ary
_changeswi
l
lbe
f
ir
edanditwi
lldi
splaythefol
l
owingr
esul
t:

Ol
dsalary
:
Newsalar
y:7500
Sal
arydi
ff
erence:

Becausethi
sisanewr ecor
dsooldsalaryisnotav
ail
abl
eandaboveresul
tiscomi
ngasnul
l.Now,l
et
usperfor
m onemor eDMLoperati
onont heCUSTOMERSt abl
e.Her
eisoneUPDATEstat
ement,whi
ch
wil
lupdateanexi
sti
ngrecor
dinthetabl
e:

UPDATEcust
omers
SETsal
ary=sal
ary+500
WHEREid=2;

Whenarecor
disupdatedinCUSTOMERSt abl
e,abov
ecr
eat
etr
iggerdi
spl
ay_
sal
ary
_changeswi
l
lbe
f
ir
edandi
twil
ldi
spl
aythefol
lowi
ngresul
t:

Oldsalar
y:1500Newsal
ary
:2000
Salar
ydiff
erence:
500
8
Packages

PL/SQLpackagesareschemaobj
ect
sthatgr
oupsl
ogi
cal
l
yrel
atedPL/
SQLt
ypes,
var
iabl
esandsubprograms.

Apackagewi
l
lhav
etwomandat
orypar
ts:

Packagespeci
fi
cat
ion

Packagebodyordef
ini
ti
on
PackageSpeci
fi
cat
ion
Thespeci ficat
ion isthei nt
erf
acet othepackage.I tjustDECLARES t
het ypes,
vari
ables,constants,excepti
ons,cur
sors,andsubprogramsthatcanberefer
enced
fr
om out sidet hepackage.I notherwor ds,i
tcontainsalli
nfor
mati
onaboutt he
contentofthepackage, butexcl
udesthecodeforthesubprogr
ams.

Al
lobj
ectsplacedi
nthespeci
fi
cati
onarecal
ledpubl
icobj
ects.Anysubprogr
am not
i
nthepackagespeci
fi
cat
ionbutcodedi
nthepackagebodyi
scalledapri
vateobj
ect.

The foll
owing code sni
ppetshows a package speci
fi
cat
ion hav
ing a singl
e
procedur
e.Youcanhav emanyglobalv
ari
abl
esdefi
nedandmul ti
pleprocedur
esor
functi
onsinsi
deapackage.

CREATEPACKAGEcust_salAS
PROCEDUREf
ind_
sal
(c_i
dcust
omer
s.i
d%t
ype)
;END
cust_sal
;
/

Whent
heabov
ecodei
sexecut
edatSQLpr
ompt
,itpr
oducest
hef
oll
owi
ngr
esul
t:

Packagecr
eat
ed.
PackageBody

Thepackagebodyhast hecodesf orvar


iousmet hodsdeclar
edi nthe
packagespeci
fi
cat
ionandotherpr
ivat
edecl
arat
ions,
whi char
ehiddenfr
om
codeoutsi
dethepackage.

TheCREATEPACKAGEBODYSt at
ementi susedf orcreati
ngthepackage
body.Thef ol
lowingcodesnippetshowst hepackagebodydecl arat
ionf
or
the cust_
salpackage creat
ed above.Iassumed t hatwe alreadyhave
CUSTOMERSt abl
ecreat
edi nourdat abaseasment ionedin PL/ SQL-
Vari
ableschapter.

CREATEORREPLACEPACKAGEBODYcust _
salAS
PROCEDUREf i
nd_sal(c_i
dcustomers.
id%TYPE)
ISc_
sal customers.sal
ary%TYPE;
BEGIN
SELECTsal aryINTOc_ sal
FROM cust omers
WHEREi d=c_ i
d;
dbms_ output
.put_li
ne('
Sal
ary:
'|
|c_sal
);
ENDfind_sal;
ENDcust_sal;
/

Whentheabov
ecodei
sexecut
edatSQLpr
ompt
,itpr
oducest
hef
oll
owi
ng
r
esul
t:

Packagebodycr
eat
ed.

Usi
ngthePackageEl
ement s
Thepackageel
ements(var
iabl
es,
procedur
esorf
unct
ions)ar
eaccessed
wit
hthefoll
owi
ngsyntax:

package_
name.
element
_name;

Consi
der,
wealreadyhavecr
eat
edabovepackagei
nourdatabaseschema,
thef
oll
owingpr
ogram usest
hefi
nd_sal
methodofthecust
_salpackage:

DECLARE
codecust
omer s.
id%type:=&cc_
id;
BEGI
N
cust
_sal
.f
ind_
sal(code);
END;
/

Whent heabovecodei
sexecutedatSQLprompt,i
tpr
ompttoent
er
customerIDandwhenyouenteranID,i
tdi
splay
scorr
espondi
ngsal
aryas
fol
lows:

Ent
erval
ueforcc_
id:
1
Sal
ary
:3000

PL/
SQLpr
ocedur
esuccessf
ull
ycompl
eted.
THEPACKAGESPECI
FICATI
ON:

CREATEORREPLACEPACKAGE
c_packageAS--Addsacust omer
PROCEDUREaddCust omer (
c_i
d
customers.
id%t
y pe,c_
name
customers.
name%t ype,
c_agecustomers.age%type,
c_addr
customers.
address%type,
c_salcust
omers.salar
y%type);
--Removesacustomer
PROCEDUREdel Cust
omer (
c_i
d
customers.
id%TYPE)
;--
List
sallcust
omer
s
PROCEDUREl ist
Cust
omer ;
ENDc_
package;
/

Whent heabov
ecodeisexecutedatSQLprompt
,itcr
eat
est
heabov
e
packageanddispl
ayst
hefoll
owingresul
t:

Packagecr
eat
ed.

CREATI
NGTHEPACKAGEBODY:

CREATEORREPLACEPACKAGEBODY
c_packageASPROCEDUREaddCust omer (c_i
d
customer s.
id%t ype,
c_name
customer s.name%t ype,c_age
customer s.age%type,c_addr
customer s.address%type,
c_salcustomer s.salar
y%type)
IS
BEGI N
INSERTI NTOcust omers(id,name,age,address,
sal
ary
)
VALUES( c_
id,c_name,c_ age,
c_ addr,c_sal
);
ENDaddCust omer ;
PROCEDUREdelCustomer(
c_i
d cust
omer
s.i
d%t
ype)I
S
BEGIN
DELETEFROM customers
WHEREid=c_id;
ENDdelCust
omer;
PROCEDUREl istCustomerI SCURSORc_ cust omer sis
SELECT nameFROM cust omer s;
TYPEc_ l
isti sTABLEOFcust omers.name%t y pe;name_ l
ist
c_l
ist:=c_ list()
;
counteri nteger:=0; BEGIN
FORnI Nc_ customer sLOOPcount er:=
counter+1; name_ li
st.extend;
name_ l
ist(counter):=n. name;
dbms_ output.put_l
ine('Customer('||counter|
|
'
)'
||
name_ l
ist(count er)
);
ENDLOOP;
ENDl i
st Cust omer ;END
c_package;
/
Abov eexampl emakesuseofnest edtablewhi chwewi lldi
scussi
nthenextchapter
.
Whent heabov ecodei sexecut edatSQLpr ompt ,itproducesthef
oll
owingresul
t:

Packagebodycreat
ed.
USINGTHEPACKAGE:
Thefoll
owingpr
ogram usest
hemet
hodsdecl
aredanddef
inedi
nthepackage
c_package.

DECLARE
codecustomer s.i
d%t ype:
=8; BEGIN
c_package.addcust omer(7, ' Raj
nish'
, 25, ' Chennai
', 3500);
c_package.addcust omer(8, ' Subham', 32, ' Del
hi'
, 7500);
c_package.l
istcustomer;
c_package.delcustomer (
code);
c_package.li
stcustomer ;
END;
/
Whentheabov ecodei sexecut edatSQLpr ompt,
itpr
oducesthefoll
owi
ngr
esul
t:
Cust
omer (
1):Ramesh
Cust
omer (
2):Khil
an
Cust
omer (
3):kaushik
Cust
omer (
4):Chaital
i
Cust
omer (
5):Hardik
Cust
omer (
6):Komal
Cust
omer (
7):Rajnish
Cust
omer (
8):Subham
Cust
omer (
1):Ramesh
Cust
omer (
2):Khil
an
Cust
omer (
3):kaushik
Cust
omer (
4):Chaital
i
Cust
omer (
5):Hardik
Cust
omer (
6):Komal
Cust
omer (
7):Rajnish
PL/
SQLpr
ocedur
esuccessf
ull
ycompl
eted

Вам также может понравиться