Chapter 9: Cursors
.
(Implicit Cursors)
For the standard DEPT and EMP tables available in user SCOTT/TIGER,
increase the salary by 10% of the employee whose EMPNO is taken as input.
Display messages regarding this update.
DECLARE
NO EMPEMPNO%TYPE;
BEGIN
UPDATE EMP
; SET SAL = SAL * 1.1 WHERE EMPNO = &NO;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE(EMPLOYEE DOES NOT
EXIST’);
ELSE :
DBMS_OUTPUT.PUT_LINE(‘SALARY UPDATED");
END IF;
END;
Write a PL/SQL block, which takes as input an employce name. If this employee
earns more than 5000 then give him commission, which is 25% of his salary, and
if he earns less than 1000 then remove him from the EMP table. Give appropriate
messages.
DECLARE ;
NAME EMP.ENAME%TYPE;
107SQL & PL/SQL Practice Book
BEGIN
NAME
UPDATE EMP SET COMM = NVL(COMM,0) + 0.25*SAL
WHERE ENAME = NAME AND SAL > 5000;
IF SQL%FOUND THEN
‘&NAME’;
DBMS_OUTPUT-PUT_LINE(NAME|’ EARNS MORE THAN
5000");
ELSE
DELETE FROM EMP
WHERE ENAME = NAME AND SAL <= 1000;
IF SQL%FOUND THEN
DBMS_OUTPUTPUT_LINE(NAME| ) EARNS LESS THAN 1000)
ELSE
DBMS_OUTPUT.PUT_LINE(‘EMPLOYEE DOES NOT
EXIST’);
END IF;
END IF;
END;
Write a PL/SQL block for the WORKER table as per the following:
> If the worker is specialized in ‘CARPENTRY’ increase his wage by 10%.
If the worker is specialized either in ‘PAINTING’ or
the wage by 15%,
v
‘FABRICATION’ then increa®
For each worker having wage less than 50, update the wage to 50.
v
Im each of the above cases display the total number of workers whose wage bi
been changed as per condition,Cursors
VORKER (YORKER 1D, NAM WAGE_PER_HOUR, SPECIALISED_IN,
MANAGER_ID)
BEGIN
UPDATE WORKER
SET WAGE_PER_HOUR = WAGE_PER_HOUR * 1.1
WHERE SPECIALISED_IN = ‘CARPENTRY’;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘TOTAL WORKER:
CARPENTRY ‘|| TO_CHAR(SQL%ROWCOUNT);
§ SPECIALIZED IN
END IF;
UPDATE WORKER
SET WAGE_PER_HOUR = WAGE_PER_HOUR * LIS
WHERE SPECIALISED_IN IN (‘PAINTING’, ‘FABRICATION’ );
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘TOTAL. WORKERS SPECIALIZED IN
PAINTING OR FABRICATION ‘|| TO_CHAR(SQL%ROWCOUNT),
END IF;
UPDATE WORKER
SET WAGE_PER_HOUR = 50
WHERE WAGE_PER_HOUR < 50;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘TOTAL WORKERS EARNING LESS THAN 50 ‘|
TO_CHAR(SQL%ROWCOUNT); *
END IF;
END;
109A
AY ea dae Hii css oe
dain Crmsor's) a RR a
Aras A AAHOL Mach (0 alyplay’ the top Ave bizhest paid worker,
Seeehuant WU OROLISHING _
WWORNA QVORKERAID, NAME, WAGE, PEROUR, SPECT ALISEy
MANAGRHR UD)
ty
Tris eae abo L achioved usings SQL command, (Top-N Analysis)
DECLARE
CURSOR CL IS SELECT * FROM WORKER
WHERE SPECIALISED_IN = ‘POLISHING’
ORDER BY WAGE_PER_HOUR DESC;
RL CL&ROWTYPE;
BEGIN
OPEN Cl;
DBMS_OUTPUTPUT_LINE(‘WORKER NO?’ |) WORKER NAME
* || (WAGE PER HOUR’);
LOOP
FETCH C1 INTO RI;
EXIT WHEN C1%NOTFOUND OR C1%ROWCOUNT > 5;
DBMS_OUTPUTPUT_LINE(WORKER_ID||NAME|
|WAGE_PER_HOUR);
END LOOP;
CLOSE Cl;
END;
110DECLARE
DN DEPT.DNAME% TYPE;
D _DEPT.DEPTNO% Type;
FLAG BOOLEAN;
E EMP%ROWTYPE;
CURSOR C1 IS SELECT * FROM EMP;
BEGIN
FLAG := FALSE;
DN := ‘&DNAME’;
SELECT DEPTNO INTO D
FROM DEPT
WHERE DEPTNO IN
(SELECT DEPTNO
FROM DEPT
WHERE UPPER(DNAME) = UPPER(DN));
OPEN C1;
Loop
FETCH C1 INTO E;
EXIT WHEN (C1%NOTFOUND;
IF EDEPTNO = D THEN
IF (TO_NUMBER(TO_CHAR(SYSDATE,'YYYY'))
111: PLISQL Practice Book -
SLs TO_NUMBERTO_CHAR(E-HIREDATE, YYYY", :
ieee ceneieeceteer TE-ENAM,
* [IE-HIREDATE);
FLAG := TRUE;
END IF;
END IF;
END LOOP;
CLOSE C1;
IF FLAG = FALSE THEN
DBMS_OUTPUT-PUT_LINE(‘NO EMPLOYEE HAS WORKED
FOR 5 YEARS IN DEPARTMENT : ‘IDN);
END IF;
DN DEPT.DNAME%TYPE;
FLAG BOOLEAN;
CURSOR Cl(NM DEPT.DNAME%TYPE) Is
SELECT * FROM EMP
WHERE (TO_NUMBER(TO_CHAR(SYSDATE,YYYY")) .
TO.NUMBER(TO_CHAR(HIREDATE-"YYYy")) >= 5
AND DEPTNO IN
(SELECT DEPTNO FROM DEPT
WHERE UPPER(DNAME) = UPPER(NM));
Rl Ci%ROWTypR;
112Cursors
BEGIN
DN := ‘&DN’;
OPEN CI(DN);
LOOP
FETCH Cl INTO RI;
EXIT WHEN C1%NOTFOUND;
DBMS_OUTPUT:PUT_LINE(RI.EMPNO|/ ‘|RLLENAME||
* |IRL-HIREDATE);
END LOOP;
CLOSE Cl;
END;
4, For each job, display the worker ids of workers working on it, the total days each
worker will work and the grand total of days assigned.
WORKER. (WORKER ID, NAME, WAGE_PER_HOUR, SPECIALISED_IN,
MANAGER _ID)
JOB (JOB ID, TYPE_OF_JOB, STATUS)
JOB_ASSIGNED (WORKER ID,JOB ID,STARTING_DATE, NUMBER_OF_DAYS)
DECLARE
CURSOR C1 IS SELECT * FROM JOB;
CURSOR C2 (JID JOB.JOB_ID%TYPE) IS
SELECT * FROM JOB_ASSIGNED
WHERE JOB_ID = JID;
0:
G_TOTAL. NUMBER(7) ::
BEGIN
13Book
SQL & PL/SQL
FOR RI IN Cl
LOOP
DBMS_OUTPUTPUT_LINE(‘JOB : ‘|R1.TYPE_OF_JOB);
DBMS_OUTPUTPUT_LINE('WORKER ID DAYS ASSIGNED),
FOR R2 IN C2 (RI.JOB_ID)
Loop
G_TOTAL := G_TOTAL + R2.NUMBER_OF_DAYS; -
DBMS_OUTPUT.PUT_LINE(R2.WORKER_ID]|’
‘|IR2.NUMBER_OF_DAYS);
END Loop;
DBMS_OUTPUT.PUT_LINE(‘ 3
DBMS_OUTPUTPUT_LINE(TOTAL DAYS ASSIGNED ‘FOR
JOB ‘| R1.TYPE_OF_JOB I: Ml G_TOTAL);
G_TOTAL := 0;
END Loop;
END;
4
For each worker in the W
‘ORKER table, pass the worker ;
> rker id O
the JOB_ASSIGNED table and display d Bare
etails of only those wo a
‘completed their work, (STARTING_DATE + NUMBER OF ee, ir
= ' _OF_DAYS < sys
ME GLORKER ID.NAME.WAGE.FER HOUR sPecia,
MANAGER _ID) ae
40808 ID. 7¥PE_OF Jon, staTus)
JOB_ASSIGNED YORKER 1,108 1p,
peahee STARTING Dare, NUMBER_-OF DAYS)[
‘Cursors
CURSOR CI IS SELECT * FROM WORKER;
CURSOR C2 (WID WORKER.WORKER_ID§TYPR) Is
SELECT * FROM JOB_ASSIGNED
WHERE WORKER_ID = WID
AND STARTING_DATE + NUMBER_OF_DAYS < SYSDATE;
BEGIN
DBMS_OUTPUT.PUT_LINECNAME — WAGE SPECIALITY");
FOR RI IN Cl
Loop
FOR R2 IN C2 (RIWORKER_ID)
Loop
DBMS_OUTPUT.PUT_LINE(RILNAME||’
‘IRI. WAGE_PER_HOUR||’ ‘|RLSPECIALISED_IN);
END LOOP;
END LOOP;
END;
Write a PL/SQL block, which will give a raise in salary to the employees as per
the following : :
If salary + comm. < 5000 increase by 10% of salary
If salary + comm, >= 5000 increase by 500 + 12% of salary above 7000
"
”
Select .. For Update Being Used In Cursor
“Cursor - For Loop Used
DECLARE .
CURSOR C1 IS SELECT SAL, COMM FROM EMP FOR UPDATE; ;
us=
1 PUNE Beactioe Hook
AMT DNA ee
ncn
VOR IRE IN GC!
Looe
WECRLSAL | NVLUULCOMM, 0)) < 5009 THEN
UPDATI EMP
SUT SAL = SAL #14
WHERE CURRENT OF C1;
ELSE
IE RLSAL > 7000 THEN
BLAM
E_AMT
END IF;
UPDATE, EMP
SET SAL = SAL + 500 4 B_AMT
WHERE CURRENT OF C1;
END IP;
END Loop;
COMMIT,
END;
6a : Cursors
suppose you have created the following three tables in the database. Write a PL/
. sQL block which will read records one by one from the PART_TRANS table and
make necessary updates in the PART_MASTER table. However if after the up-
date the TOT_QTY is going below the REORDER_LEVEL then the
PART_MASTER is not to be updated and the necessary details are stored in the
TEMP table.
PART_MASTER (P#, PNAME, PRICE, TOT_QTY, REORDER_ LEVEL)
PART_TRANS (O#, P#, QTY_REQ) Where O# is the order no.
TEMP (P#, QTY)
DECLARE
CURSOR CT IS SELECT * FROM PART_TRANS; :
CURSOR CM(PNO PART_MASTER.P#%TYPE) IS
SELECT * FROM PART_MASTER
WHERE P# = PNO;
BEGIN
FOR RT IN CT
LOOP
FOR RM IN CM(RTP#) E
Loop
IF (RM.TOT_QTY - RT-QTY_REQ) < RMREORDER_LEVEL
THEN
DBMS_OUTPUT.PUT_LINE(‘NOT ENOUGH
QUANTITY OF PART ‘|RM.P#|’ AVAILABLE’);
INSERT INTO TEMP
7K
118
UPDATE PART_MASTER
SET TOT_QTY = TOT_QTY - RT.QTyY Rig
WHERE P# = RT.PH;
END IF;
END Loop;
END Loop,
COMMIT,
END;
Write a PL/SQL block for the CANDIDATE table. The CANDIDATE tape cong
all information except the RANKNO. The RANKNO is assigned as explained
The RANKNO is of 8 characters. First three characters should be ‘111°, The (oy
character represents the category of the candidate. The test Of the characters denote
rank of the candidate category wise in descending orde? of the Percentage,
_ In the program given below if there is more than one student of the same category
the same percentage then the rank assigned is as per the record inserted (accesse
Students with same category and same percentage are not assigned the same ra
CANDIDATE (RANKNO, FORMNO, NAME, CATEGORY, PERCENTAG!
Codes for different categories is:
> GENERAL : 1
dos SC za
> ASE 73
> SEBC’ oat od
> PH. : 5
> ~~ EX-SM : 6Cursors
DECLARE
CANDIDATE.RANKNO%TYPE;
RI
p2 CANDIDATE.RANKNO%TYPE;
3 VARCHAR2(4);
CURSOR Cl IS SELECT CATEGORY
FROM CANDIDATE
GROUP BY CATEGORY;
CURSOR C2 (C CANDIDATE.CATEGORY%TYPE) JS
SELECT * FROM CANDIDATE.
WHERE CATEGORY = C
ORDER BY PERCENTAGE DESC;
CNT NUMBER(4);
BEGIN
FOR RECI IN Cl
LOOP
nae anne
CNT = 0;
IF RECI.CATEGORY = ‘GENERAL’ THEN
R3:= RG’;
ELSIF RECI.CATEGORY = ‘SC’ THEN
© RB c= R3lf2";
ELSIF RECI.CATEGORY = ‘ST’ THEN
R3 = R33";
ELSIF RECL.CATEGORY = ‘SEBC’ THEN
gySQL & PLISQL Practice Book
R3 := R35";
| ELSE .
t R3 := R3|l'6";
| END IF;
FOR REC2 IN C2 (REC1.CATEGORY)
LOop
CNT := CNT + 1;
R2 := LPAD(TO_CHAR(CNT), 4, 0);
RI := R3IIR2;
UPDATE CANDIDATE,
SET RANKNO = RI
WHERE FORMNO = REC2.FORMNO;
END Loop;
END LOop;
commarr,
END;
8. For the given table, check which students have to pay fine and the amount
fine to be paid. A student can keep the book for 15 days. If the number of &
has exceeded 15 then, the fine is calculated as follows:
Upto 7 days: 50 paise per day z
B15 days -; Rell'per day (to be counted from the 8th day onwass)
i
More than 15: Re 1.5 per day (60 be counted from the 16th day on!
120Cursors
printed out.
LNO, BOOKNO, ISSUE_DATE, RETURN_DATE,
can Tater be
pINE (ROL
| qor_DAYS, FINE)
pEcLARE
uM NUMBER (3);
FINE NUMBER (5,2) := 0;
CURSOR C1 IS SELECT * FROM ISSUE;
TEMP NUMBER (3);
BEGIN
FOR RI IN Cl
LOOP
TEMP := RI.RETURN_DATE - R1.ISSUE_DATE;
TEMP := TEMP - 15 ;
IF (TEMP > 7) THEN.
NUM := TEMP - 7;
FINE := 3.5;
IF (NUM > 8) THEN
FINE := FINE + 8
NUM := NUM - 8;
FINE :=FINE + NUM * 1.5;
ELSE ;
FINE := FINE + NUM;
121SQL & PLISQL Practice Book
F (TEMP > 0) THEN
TEMP * 0.5;
FINE
END IF;
IF (FINE > 0) THEN
INSERT INTO FINE VALUES (RI-ROLLNO,
RIBOOKNO, RLISSUE_DATE, R1-RETURN_DATE,
RI.RETURN_DATE - RI.ISSUE_DATE, FINE);
END IF ;
END LOOP;
COMMIT:
END;
Write a PL/SQL block, which will accept the entrance test id and test center
from user and display details about all those applicants who have scored mn
than average for that test. Also display details about the dates on which that te
center had full attendance.
APPLICANT (AID, ANAME, ADDR, ABIRTH_DT)
ENTRANCE_TEST (ETID, ETNAME, MAX_SCORE, CUT_SCORE)
ETEST_CENTRE (ETCID, LOCATION, INCHARGE, CAPACITY)
ETEST_DETAILS (AID, ETID, ETCID, ETEST_DT, SCORE)
DECLARE
T_VAR_ID ENTRANCE_TEST.ETID%TYPE;
TC_VAR_ID ETEST_CENTRE.ETCID%TYPE;
/* ‘cursor Cl finds the average score for :
the input test Id and test centre Id Ws1 (T_VAR_ID ENTRANCE TID%TYP
T_CENTRE.ETCID%TYPE) 15
SELECT ETID, AVG (SCORE) AS AVERAGE
CURSOR
7C_VARID
FROM ETEST_DETAILS
WHERE ETCID = TC_VAR_ID
AND, ETID = T_VAR_ID;
cursor C2 finds all details of the test taken for
the input test Id and test centre Id 4
CURSOR C2 (T_VAR_ID ENTRANCE_TEST.ETID@TYPE,
TC_VAR_ID ETEST_CENTREETCID%TYPE) IS
SELECT * FROM ETEST_DETAILS
WHERE ETCID = TC.VAR_ID
AND ETID= T_VAR_ID;
cursor C3 finds the dates on which the test centre
had full attendance y
CURSOR C3 (TC_VAR_ID ETEST_CENTREETCID%TYPE) IS
SELECT ETEST_DT
FROM ETEST_DETAILS
WHERE ETCID = TC_VAR_ID
GROUP BY ETEST_DT
HAVING COUNT(*) =
(SELECT CAPACITY
: FROM ETEST_CENTRE
WHERE ETCID = TC_VAR_ID);
123SQL & PLISQL Practice Book
'&T_VAR_ID’
TC_VARID := '&TC_VAR_ID';
FOR RI IN CI(T_VAR_ID, TC_VAR_ID)
LOOP
FOR R2 IN C2(T_VAR_ID, TC_VAR_ID)
Loop
IF (R2.SCORE > RI.AVERAGE) THEN
FOR CAN_REC IN (SELECT * FROM
APPLICANT WHERE AID=R2.AID)
Loop
DBMS_OUTPUT.PUT_LINE (CAN_REC AID
‘| CAN_REC.ANAME ||’ < |]
CAN_REC.ABIRTH_DT );
END Loop;
END IF;
END Loop;
END Loop;
DBMS_OUTPUT-PUT_LINE(‘DATES ON WHICH ‘ || TC_vAR_IDI!
REMAINED FULL ARE: *);
FOR R3 IN C3 (TC_VAR_ID)
Loop
PBMS_OUTPUT-PUT_LINE(R3.ETEST_DT);
END Loop; ;
END;
124rogram has a CURSOR FOR loop using a sub-query Th
of the cursor in the LARE section. The applicant information
re above P
NT table based on the value of applicant id (R2.AID)
declaration
med from the APPLICA
. fis retrieved from cursor C2. The syntax used is:
pal
th
FOR CAN_REC IN (SELECT * FROM APPLICANT WHERE AID=R2.AID)
LOOP
DBMS_OUTPUT.PUT_LINE (CAN_REC.AID ||’ ‘Il
CAN_REC.ANAME ||‘ || CAN_REC.ABIRTH_DT );
END LOOP;
wyrite a PLISQL block, which will accept the applicant id from the user and will
display details about the applicant and details of all the tests the applicant has
appeared for with his scores. :
APPLICANT (AID, ANAME, ADDR, ABIRTH_DT)
ENTRANCE_TEST (ETID, ETNAME, MAX_SCORE, CUT_SCORE)
ETEST_CENTRE (ETCID, LOCATION, INCHARGE, CAPACITY)
ETEST_DETAILS (AID, ETID. ETCID, ETEST_DT, SCORE)
DECLARE,
ID APPLICANT.AID%TYPE;
CURSOR CI(ID APPLICANT.AID%TYPE) IS
SELECT * FROM APPLICANT
WHERE AID = ID;
CURSOR C2(ID APPLICANT.AID%TYPE) IS
SELECT ETID, SCORE FROM ETEST_DETAILS
WHERE AID = ID;
CURSOR G3(TNO ETEST_DETAILS.ETID%TYPE) IS
SELECT ETNAME FROM ENTRANCE_TEST
125SQL & PL/SQL Practice Book
WHERE ETID = TNO;
Rl CI%ROWTYPE;
R2 C2%ROWTYPE;
BEGIN
ID := ‘&ID';
OPEN C1 (ID);
LOOP
FETCH C1 INTO RI;
IF CI%NOTFOUND THEN
IF Cl1%ROWCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE(‘APPLICANT DOES NOT
EXIST’);
* END IF;
EXIT;
ELSE
OPEN C2 (ID);
Loop
FETCH C2 INTO R2;
IF C2%NOTFOUND. THEN
IF C2%ROWCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE(‘APPLICANT HA
NOT APPEARED IN ANY TEST’);
END IF;
EXIT;
126 *Cursors
ELSE
IF C2%ROWCOUNT = | THEN
DBMS_OUTPUT.PUT_LINE(‘. *);
DBMS_OUTPUT.PUT_LINE (RI.ANAME);
DBMS_OUTPUT.PUT_LINE(TEST NAME
SCORE’);
END IF;
FOR R3 IN C3(R2.ETID)
Loop
DBMS_OUTPUT.PUT_LINE
(R3.ETNAME|) ‘|R2.SCORE);
END Loop;
END IF;
END LOOP;
CLOSE C2;
END IF;
END LOOP;
CLOSE C1;
END;
'\ For the tables given below, take as input the team id and write a PLISQL block
“hich outputs the details of the match as per the format given below:
TEAM NAME : INDIA
NAME QUT TYPE BOWLER NAME SCORE
AA LBW BB 50
BB RUN OUT cc CS
. =
‘AL SCORE : 150 7a SQL & PLISQL Practice Book
> TEAM(TEAM_ID ,TEAM_NAME );
PLAYER (TEAM_ID,PID,PNAME ,PBIRTHDAY,);
BOWLING(TEAM_ID, BOWLER_ID ,OVER, MAIDEN, RUN
WICKET_TAKEN) :
SCORE(TEAM_ID, PID, RUNS_MADE, OUT_TYPE, BALLER_Ip)
Ciyp,
EXTRA_RUN((TEAM_ID,WIDE_RUN NUMBER(2), NO_RUN , BYE Ruy
DECLARE
TOT NUMBER(4):=0;
TID VARCHAR2(30);
TPID VARCHAR2(5);
PNM VARCHAR2(30);
BNM VARCHAR2(30);
s SCORE%ROWTYPE;
T TEAM%ROWTYPE;
CURSOR Cl IS SELECT PID, PNAME FROM PLAYER
WHERE TEAM_ID = TID;
CURSOR C2 IS SELECT * FROM SCORE
WHERE PID = TPID AND TEAML_ID = TID;
CURSOR C3 IS SELECT PNAME FROM PLAYER
WHERE TEAM_ID = S.BTEAM_ID
AND PID = S.BALLER_ID;
BEGIN
TID:= *&TEAM_ID';
SELECT * INTO T FROM TEAM WHERE TID=TEAM_ID;
128OUT TYPE'|!’ BOWLER
pnts OUTPUTPUT_LINECNAME’
NAME")
OPEN Cl:
“SCORE’);
LooP
FETCH Cl INTO TPID, PNM;
EXIT WHEN CI%NOTFOUND;
DBMS_OUTPUTPUT(RPAD(PNM,I5)||"_*);
OPEN C2;
FETCH C2 INTO S;
IF C2%FOUND THEN
IF S.BALLER_ID< ‘ * THEN
OPEN C3;
FETCH C3 INTO BNM;
CLOSE C3;
END IF;"
DBMS_OUTPUTPUT(S.OUT_TYPE ||’ ‘|BNMI’
‘||S.RUNS_MADE);
BNM:=" 7
TOT:=TOT+S.RUNS_MADE;
END IF;
CLOSE C2;
DBMS_OUTPUT:PUT_LINE("");
END Loop,
129
>SQL & PL/SQL Practice Book
CLOSE C1;
DBMS_OUTPUT.PUT_LINE(TOTAL SCORE : ‘||TOT);
END;
12, A supermarket maintains its stock systematically and wants 9 print the 4,
the following format, Write a PL/SQL code to execute it using the tables gi.
ITEM_MASTER(T_CODE,IT_NAME,IT_STOCKIT_UNITAT_ pricy,
CUST_MASTER(CUST_CODE,CUST_NAME.CUST_ADD.DUE_AMoty,
BILL(BILL_NO.BILL_DATE, CUST_CODE)
BILL_TRAN(BILL_NO,IT_CODE,IT_QTY)
CUSTOMER :
BILL NO
=
BILL DATE : Dat,
SR.NO. TEM NAME QTy UNIT _PRICE AMOUNT
1
TOTAL AMOUNT :
CCODE CUST_MASTER.CUST_CODE&TYPE:
CNAME CUST. —MASTER.CUST_NAMESZTYPE;
CaDD CUST_MASTER.CUST_ADD&TYPE:
BNO BILLBILL_NOZTYPE;
BDATE BILL BILL_DATESTYPE:
ITEM_MASTER.IT_NAMESZTYPE:
msCursors
ae ITEM_MASTER.IT_PRICE%TYPE;
a BILLTRAN.IT_QTY%TYPE;
BILL.BILL_NO®TYPE;
i NUMBER(10);
jawt. —- NUMBER(10);
NUMBER(3) := 1;
SR
cuRSOR C IS SELECT CUST_MASTER.CUST_CODE, CUST_NAME, CUST_ADD,
sL_NO, BILL_DATE FROM CUST_MASTER, BILL WHERE BILL_NO = B AND
(ist. MASTER.CUST_CODE = BILL.CUST_CODE;
nso I IS SELECT IT_NAME, IT_QTY, IT_UNIT, IT PRICE
ROM ITEM_MASTER, BILLTRAN WHERE
TEM MASTER.IT_CODE = BILLTRAN.IT_CODE AND BILL_NO = B:
BEGIN
B= &BILL_NO;
OPEN C;
LOOP
FETCH C INTO CCODE,CNAME,CADD,BNO,BDATE;
EXIT WHEN C%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(‘CUSTOMER:’);
DBMS_OUTPUTPUT_LINE(‘CODE: ‘ || CCODE || *
‘Il BILL No.: « || BNO);
DBMS_OUTPUTPUT_LINE(‘NAME: “|| CNAME || ¢
‘I BLL DaTE.: + || BDATE);
PBMS_OUTPUT.PUT_LINE(‘ADDRESS: + || CADD);
131
he= ee,
SQL & PL/SQL Practice Book
DBMS_OUTPUT.PUT_LINEC:
a OS
i DBMS_OUTPUTPUT_LINECSR NO. ITEM NAMB.
: UNIT PRICE AMOUNT"); Ory
DBMS_OUTPUT-PUT LINE(—
S eee
END LOOP;
CLOSE C;
AMT
TAMT
OPEN I;
LOOP
FETCH I INTO INAME,IQTY,IUNIT,IPRICE;
EXIT WHEN I%NOTFOUND;
AMT := IQTY * IPRICE;
DBMS_OUTPUT.PUT_LINE(SR || *. * || INAME |]
“Wiery ys‘ TUNIT||* ‘PRICE ||‘ + || AMT;
TAMT := TAMT + AMT;
SR := SR + 1;
END LOOP;
DBMS_OUTPUT.PUT_LINE(*_________——
Ds
DBMS_OUTPUT.PUT_LINE(‘TOTAL AMOUNT : ‘ || TAMT);
CLOSE I;
END;
132a N
Cursors
oC li
‘ cursos)
ak
i wi eanptoyee code, mame, sabi and departnent name for the employees
yt
‘ - sgatany IS more
, PUTIGRR and use cursor vartabley
than the Input vate, (Use the standard EMP and DEPT
pwc ol soo!
pw ANU
BMBSALW TYPE;
§
pvp RHC IS RECORD
ane EMBEMPNOWTYPE,
PMENM | BMRENAMBS TYPE,
yaw BMRSALPYR,
DAMENM. DEPRDNAMBYTYPE);
EMIREC RECS
Using a strong ref cursor type y j
TOE TCUR IS REF CURSOR RETURN REC;
EMICUR TCR:
SAIN
Seedy
OPEN EMMCUR FOR SELECT EMPNO, ENAME, SAL, DNAME i
FROM EMP, DEPT i
WHERE EMPDEPTNO = DEPTDEPTNO
AND SAL > S;
Loop
FETCH EMPCUR INTO EMPREC;
EXIT WHEN. BMPCURGNOTFOUND:
ae
133DIMS_OL “y
DDMS_OUTPUT.PU!
DEPINM {| *
s
piiMs_OUT
DIMS_O1
END LOOP,
yMP
STUDENT (ROLL.NO, NAME, MARKSI, MARKS2, MARKS3,
JASQL, block, which calculates the percentage for exch
warks ws 100 for ea
write w
i puns
splay the detally al ve scored highest
”
ANY.S ANY
NM
MKS
vw
"
MAXI
MAK2
MAKS
™
IN
FOR RI IN CI
Loop
IF REMARKS! > 40 any RIMARKSD » gg
RKS2 > 49
AND RUMARKS3 > 49 THe,
RLMARKSI + RiMARKs? RiManKsa,
F Pls via;
ELSE
PIL = NULL;
END
UPDATE STUDENT
PERCENTAGE = 1
WHERE ROLLNO = RILROLLNO;
IP MAXI < RILMARKSI THEN
MAXI c= RLMARKSI:
END 1
IP MAX2 « RLMARKS2 THEN
MAX2 = RLMARKS2:
END IP,
IT MAX3 < RILMARKS3 THEN
MAX3 sw RLMARKSS:
END i
usa1 & PLISQI. Practice Book
TEND LOOP:
ovurtPUT_LINECSTUDENTS SECURING HIGHEST 1N
DBM! alate!
SUBJECT! ARE!)
pening ref cursor to find students who have secured
en
”
maximum in subject
JEN ANY.S FOR SELECT NAME, MARKS!
FROM STUDENT
WHERE MARKS! = MAXI;
opt
Loop
+ FETCH ANY_S INTO NM, MKS:
EXIT WHEN ANY_S%NOTFOUND;
+ DBMS_OUTPUTPUT_LINE(NM| —“IMKS);
END LOOP;
CLOSE ANY.S;
DBMS_OUTPUTPUT_LINECSTUDENTS SECURING HIGHEST IN
SUBJECT? ARE");
1 Opening a ref cursor to find students who have secured
maximum in subject? be
OPEN ANY_S FOR SELECT NAME, MARKS2
FROM STUDENT
WHERE MARKS2 = MAX2;
Loor
FETCH ANY.S INTO NM, MKS;
EXIT WHEN ANY_S%:NOTFOUNT
DOMS_OUTPUTPUT_LINE(N
MKS);
136
END LOOP;
CLOSE ANY_S:
pBMS_OUTPUTPUT_LINE(‘STUDENTs SECURING
ARE’): HIGHEST yy, sumer
pe Opening 4 ref Cursor 10 fad students yng have se
maximum in subject? ane
OPEN ANY_S FOR SELECT NAME, MaRxsa mk
FROM STUDENT
WHERE MARKS3 = MAX3;
LOOP:
FETCH ANY_S INTO NM, MK; a
EXIT WHEN ANY_S%NOTFOUND;
DBMS_OUTPUT:PUT_LINE(NMI[
END LOOP;
CLOSE ANY_S}
“IMKs
COMMIT;
END;
Write 9 PLISQL block, which takes as i
the user w.
the choice from the user, whether
mts details about the APPLICANT or details about the
RANCE_TEST and as per the choice displays the related details,
nN
PPLICANT (ALD, ANAME, ADDR, AUIRTI_DT)
RANCE_TEST (ELL, EVNAM
DECLARE
CHOICE
MAX_SCORE, CUT_SCOI
VARCHAR2(1):
TYPE ANY_CUR IS REF
Ry
aS01 FUG Pra Ba
ANY.S ANY CUR:
APPLI_REC APPLICANTSROWTYPE:,
ETEST.REC — ENTRANCE_TEST&ROWTYPE;
(User defined exception
7
WRONG _CHOICE EXCEPTION;
BEGIN
CHOICE := “&CHOICE’;
DBMS_OUTPUTPUT_LINE
DBMS_OUTPUTPUT_LINECENTER “A” FOR. APPLICANT
DETAILS AND “T" FOR ENTRANCE TEST DETAILS’):
IF UPPER(CHOICE) NOT IN CAT) THEN
RAISE WRONG_CHOICE;
END IF;
IF UPPER(CHOICE) = “A” THEN
OPEN ANY_S FOR SELECT * FROM APPLICANT;
Loor
EXIT WHEN ANY_S&NOTFOUND;
FETCH ANY_S INTO APPLI_REC;
DBMS_OUTPUT.PUT_LINE(APPLI_REC.AII
|
* |APPy =
UAPPLLREC ANAM Stare Consors
END Loop, ULREC Ay
RTH,
CLOSE ANy_s
ELSE
OPEN ANY_S FOR seLEcp « FROM ENTRAn,
Loop Grins
FETCH ANY_s INTO TEST REC;
EXIT WHEN ANY. s@NoTFOUNp,
DEMS-OUTPUTPUT._LINEGETEST REC EID
*IBTEST_RECETNAMEy
‘IETEST_RECMAX_scorey
‘IETEST_REC.CUT_scorey,
END Loop;
CLOSE ANY_s;
END IF;
EXCEPTION
WHEN WRONG_CHOICE THEN
DBMS_OUTPUT-PUT_LINECWRONG CHOICE
ENTERED);
END;nt
Arment
J tables I the prin
Primary
‘write an appropriate exception t0 handle this erry,
ey value already exists,
DEPT(DERTNO.DNAMELOC)
DECLARE
DNO DEPTDEPTNO®T
PNM DEPTDNAMES TYPE:
Le | DEPTLOC#TYPE:
DUPLICATE_PK EXCEPTION:
PRAGMA EXCEPTION INIT(DUPLICATE_PK.-00001
RI DEPTSROWTYPE:
BEGIN
DNO:=&DNO;
INSERT INTO DEPT VALUES(DNO.DNM.LC):
EXCEPTION
WHEN DUPLICATE PK THEN
defined name to a numbered exception
ibered exception can be given #
way any
150)
140
MARY KEY VALUE ALREADY BXISTS).
functions)
Write a funetion to find whethe
whether the given number
i FUNCTION SYNTAX
1s 0d oF even,
CREATE OR REPLACE FUNCTION 0 ORE (gy
RETURN BOOLEAN nee
1s
BEGIN
RETURN ( MOD(NO,2) =
END O_OR_E;
= CALLING PROGRAM
DECLARE
NUM NUMBER(4);
BEGIN
NUM :=&NUM;
IF NUM = 0 THEN
DBMS_OUTPUT.PUT_LINECNO IS ZERO");
ELsE
IF O_OR_E(NUM) THEN
DBMS_OUTPUTPUT_LINE(NO IS ODD’
ELSE,
Is BEN’:
DBMS_OUTPUTPUT_LINECNO.
ut