You are on page 1of 31
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; 107 SQL & 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; 109 A 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; 110 DECLARE 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; 112 Cursors 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 13 Book 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; 6 a : 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 7 K 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 : 6 Cursors 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 gy SQL & 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! 120 Cursors 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; 121 SQL & 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 Ws 1 (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); 123 SQL & 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; 124 rogram 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 125 SQL & 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 7 a 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; 128 OUT 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: ms Cursors 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; 132 a 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 133 DIMS_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 us a1 & 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 a S01 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

You might also like