Sie sind auf Seite 1von 18

PL/SQL PROGRAMS

14. TO CALCULATE THE TOTAL SAL FROM THE FOLLOWING TABLE HAVING EMPNO 1004.
EMPNO ENAME BP DA HRA TOTAL ---------------------------------------------------------------------1001 ABC 5000 800 300 6100 1002 EFG 5500 900 450 6850 1003 HIJ 6200 800 350 7350 1004 KLM 6000 800 250 PL/SQL COMMAND: DECLARE E NUMBER(5); D NUMBER(4); H NUMBER(4); B NUMBER(5); T NUMBER(5); BEGIN SELECT BP,DA,HRA INTO B,D,H FROM EMP2 WHERE EMPNO=1004; T:=B+D+H; UPDATE EMP2 SET TOTAL=T WHERE EMPNO=1004; END; OUTPUT: SQL> @ sal; / PL/SQL procedure successfully completed. SQL> SELECT * FROM EMP2; EMPNO ENAME BP DA HRA TOTAL

--------------------------------------------------------------------------1001 1002 1003 1004 ABC EFG HIJ KLM 5000 800 5500 900 6200 800 6000 800 300 450 350 250 6100 6850 7350 7050

47

15. TO CALCULATE TOTAL SALARY FROM THE FOLLOWING TABLE HAVING EMPNO=1005 USING %ROWTYPE
EMPNO ENAME BP DA HRA TOTAL ----------------------------------------------------------------1001 ABC 5000 800 300 6100 1002 EFG 5500 900 450 6850 1003 HIJ 6200 800 350 7350 1004 KLM 6000 800 250 7050 1005 NOP 6500 900 450 PL/SQL COMMAND: DECLARE REC EMP2%ROWTYPE; BEGIN SELECT * INTO REC FROM EMP2 WHERE EMPNO=1005; REC.TOTAL:=REC.BP+REC.HRA+REC.DA; UPDATE EMP2 SET TOTAL=REC.TOTAL WHERE EMPNO=1005; END; OUTPUT: SQL> @ ROWTYPE; / PL/SQL procedure successfully completed. SQL> SELECT * FROM EMP2; EMPNO ENAME BP DA HRA TOTAL

--------------------------------------------------------------------------1001 1002 1003 1004 ABC EFG HIJ KLM 1005 5000 800 5500 900 6200 800 6000 NOP 800 6500 300 450 350 250 900 6100 6850 7350 7050 450 7850

48

16. TO FIND THE GREATER OF TWO NUMBERS


PL/SQL COMMAND: DECLARE A NUMBER:=&ENTER_A; B NUMBER:=&ENTER_B; BEGIN IF A>B THEN DBMS_OUTPUT.PUT_LINE('A IS GREATER'); ELSE DBMS_OUTPUT.PUT_LINE('B IS GREATER'); END IF; END; OUTPUT: Enter value for enter_a: 5 Old 2: A NUMBER:=&ENTER_A; New 2:A NUMBER:=5; Enter value for enter_b: 8 Old 3: B NUMBER:=&ENTER_B; New 3: B NUMBER:=8; B IS GREATER PL/SQL procedure successfully completed.

17. TO FIND THE GREATEST OF THREE NUMBERS


PL/SQL COMMAND: DECLARE A NUMBER:=&ENTER_A; B NUMBER:=&ENTER_B; C NUMBER:=&ENTER_C; BEGIN IF A>B THEN IF A>C THEN DBMS_OUTPUT.PUT_LINE('A IS GREATER'); ELSE DBMS_OUTPUT.PUT_LINE('C IS GREATER'); END IF; ELSE
49

IF B>C THEN DBMS_OUTPUT.PUT_LINE('B IS GREATER'); ELSE DBMS_OUTPUT.PUT_LINE('C IS GREATER'); END IF; END IF; END; OUTPUT: Enter value for enter_a: 4 Old 2: A NUMBER:=&ENTER_A; New 2: A NUMBER:=4; Enter value for enter_b: 6 Old 3: B NUMBER:=&ENTER_B; New 3: B NUMBER:=6; Enter value for enter_c: 8 Old 4: C NUMBER:=&ENTER_C; New 4: C NUMBER:=8; C IS GREATER PL/SQL procedure successfully completed.

18. TO CALCULATE ADDITION, SUBTRACTION, MULTIPLICATION AND DIVISION OF TWO NUMBERS ACCORDING TO USERS CHOICE
PL/SQL COMMAND: DECLARE A NUMBER:=&A; B NUMBER:=&B; C NUMBER; X NUMBER; BEGIN X:=&ENTER_CHOICE; IF X=1 THEN C:=A+B; ELSIF X=2 THEN C:=A-B; ELSIF X=3 THEN C:=A*B; ELSIF X=4 THEN
50

C:=A/B; ELSE DBMS_OUTPUT.PUT_LINE('NOT A VALID OPTION'); END IF; DBMS_OUTPUT.PUT_LINE('RESULT IS '||C); END; OUTPUT: Enter value for a: 10 Old 2: A NUMBER:=&A; New 2:A NUMBER:=10; Enter value for b: 5 Old 3: B NUMBER:=&B; New 3:B NUMBER:=5; Enter value for enter_choice: 3 Old 7: X:=&ENTER_CHOICE; New 7: X:=3; RESULT IS 50 PL/SQL procedure successfully completed.

19. TO PRINT A MESSAGE ACCORDING TO TIME WHEN WE EXECUTE THE PL/SQL BLOCKS
PL/SQL COMMAND: DECLARE TIME VARCHAR2(10); BEGIN TIME := TO_CHAR(SYSDATE,'HH24'); IF TIME =0 AND TIME <12 THEN DBMS_OUTPUT.PUT_LINE('GOOD MORNING'); ELSIF TIME >12 AND TIME <=17 THEN DBMS_OUTPUT.PUT_LINE('GOOD AFTERNOON'); ELSIF TIME >17 AND TIME <20 THEN DBMS_OUTPUT.PUT_LINE('GOOD NIGHT'); END IF; END; OUTPUT: GOOD AFTERNOON
51

PL/SQL procedure successfully completed.

20. TO PRINT THE NUMBERS FROM 1 TO N


PL/SQL COMMAND: DECLARE VAR1 NUMBER :=1; N NUMBER :=&ENTER_N; BEGIN LOOP DBMS_OUTPUT.PUT_LINE(VAR1); VAR1 := VAR1+1; EXIT WHEN VAR1 > N; END LOOP; END; OUTPUT: Enter value for enter_n: 7 Old 3: N NUMBER :=&ENTER_N; New 3: N NUMBER :=7; 1 2 3 4 5 6 7 PL/SQL procedure successfully completed.

21. TO CALCULATE THE SIMPLE INTEREST FOR SAME PRINCIPAL AND TIME BUT WITH DIFFERENT RATE OF INTEREST STARTING FROM 5% AND TO STORE EACH RESULT IN A PRE-FABRICATED TABLE
PL/SQL COMMAND: DECLARE P NUMBER:=&ENTER_P; R NUMBER:=5; T NUMBER:=2; SI NUMBER(6,2);
52

BEGIN WHILE R<=10 LOOP SI:=(P*R*T)/100; INSERT INTO SINTEREST (PRINCIPAL,RATE,TIME,SI) VALUES(R,R,T,SI); R:=R+1; END LOOP; END; OUTPUT: Enter value for enter_p: 100 Old 2: P NUMBER:=&ENTER_P; New 2:P NUMBER:=100; PL/SQL procedure successfully completed. SQL> SELECT * FROM SINTEREST; PRINCIPAL RATE TIME SI -----------------------------------------5 5 2 10 6 6 2 12 7 7 2 14 8 8 2 16 9 9 2 18 10 10 2 20 6 rows selected.

22. TO ACCEPT 2 NUMBERS AND RETURN ADDITION, SUBTRACTION, MULTIPLICATION AND DIVISION OF TWO NUMBERS USING PROCEDURE
PL/SQL COMMAND: DECLARE A NUMBER; B NUMBER; C NUMBER; D NUMBER; E NUMBER; F NUMBER; PROCEDURE PROCESS (A IN NUMBER, B IN NUMBER, C OUT NUMBER, D OUT NUMBER, E OUT NUMBER, F OUT NUMBER) IS BEGIN
53

C:=A+B; D:=A-B; E:=A*B; F:=A/B; END; BEGIN A:=&FIRSTNUMBER; B:=&SECONDNUMBER; PROCESS(A,B,C,D,E,F); DBMS_OUTPUT.PUT_LINE('ADDITION IS '||C); DBMS_OUTPUT.PUT_LINE('SUBTRACTION IS '||D); DBMS_OUTPUT.PUT_LINE('MULTIPLICATION IS '||E); DBMS_OUTPUT.PUT_LINE('DIVISION IS '||F); END; OUTPUT: Enter value for firstnumber: 10 Old 2: A:=&FIRSTNUMBER; New 2: A:=10; Enter value for secondnumber: 5 Old 3: B:=&SECONDNUMBER; New 3: B:=5; ADDITION IS 15 SUBTRACTION IS 5 MULTIPLICATION IS 50 DIVISION IS 2 PL/SQL procedure successfully completed.

23. TO CALL A FUNCTION BALANCE TO RETURN THE BALANCE OF A SPECIFIED BANK ACCOUNT
PL/SQL COMMAND: DECLARE ACC_NO NUMBER; BAL NUMBER; FUNCTION BALANCE (ACCT_ID NUMBER) RETURN NUMBER IS ACCT_BAL NUMBER; BEGIN SELECT BAL INTO ACCT_BAL FROM ACCTS WHERE ACC_NO=ACCT_ID;
54

RETURN ACCT_BAL; END BALANCE; BEGIN ACC_NO:=&ACC_NO; BAL:=BALANCE(ACC_NO); DBMS_OUTPUT.PUT_LINE('BALANCE IS '||BAL); END; OUTPUT: Enter value for acc_no: 7002 Old 2: ACC_NO:=&ACC_NO; New 2:ACC_NO:=7002; BALANCE IS 4550 PL/SQL procedure successfully completed.

24. TO ACCEPT THE CODE AND FIND THE RATE FOR THE CODE FROM ITEM TABLE, QTY FROM SALE TABLE AND RETURN THE PRODUCT OF RATE*QTY. THE FUNCTION IS CALLED BY PASSING CODES FROM 1 TO 5 AND ADDS UP THE TOTAL VALUES RETURNED BY THE FUNCTION AND DISPLAY IT.
PL/SQL COMMAND: DECLARE TOTAL NUMBER:=0; CTR NUMBER:=1; FUNCTION CAL_VALUE(CODE NUMBER) RETURN NUMBER IS IT_RATE NUMBER; IT_QTY NUMBER; BEGIN SELECT RATE INTO IT_RATE FROM ITEM WHERE ITEM_CODE=CODE; SELECT QTY INTO IT_QTY FROM SALE WHERE ITEM_CODE=CODE; RETURN (IT_RATE*IT_QTY); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('NO SUCH CODE'); END; BEGIN
55

WHILE CTR<5 LOOP TOTAL:=CAL_VALUE(CTR)+TOTAL; CTR:=CTR+1; END LOOP; DBMS_OUTPUT.PUT_LINE(TOTAL); END; OUTPUT: SQL> @ CODE; 25 26950 PL/SQL procedure successfully completed.

25. TO ACCEPT TWO PARAMETERS EMPID AND AMOUNT TO BE ADDED TO SALARY OF EMPLOYEE AND UPDATE IT TO THE DATABASE
PL/SQL COMMAND: DECLARE EMPNO NUMBER; AMOUNT NUMBER; PROCEDURE RAISE_SALARY(EMP_ID NUMBER, INCREASE NUMBER) IS CURRENT_SALARY NUMBER(7,2); SALARY_MISSING EXCEPTION; BEGIN SELECT SAL INTO CURRENT_SALARY FROM EMP WHERE EMPNO=EMP_ID; IF CURRENT_SALARY IS NULL THEN RAISE SALARY_MISSING; ELSE UPDATE EMP SET SAL=SAL+INCREASE WHERE EMPNO=EMP_ID; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN BMS_OUTPUT.PUT_LINE('NO SUCH NUMBER'); WHEN SALARY_MISSING THEN DBMS_OUTPUT.PUT_LINE('SALARY IS NULL'); END; BEGIN
56

EMPNO:=&EMPNO; AMOUNT:=&AMOUNT; RAISE_SALARY(EMPNO,AMOUNT); END; OUTPUT: Enter value for empno: 7900 Old 1: EMPNO:=&EMPNO; New 1:EMPNO:=7900; Enter value for amount: 500 Old 2: AMOUNT:=&AMOUNT; New 2:AMOUNT:=500; PL/SQL procedure successfully completed.

57

TRIGGERS
26. CREATE A TRIGGER THAT WILL BE FIRED FOR EACH UPDATE OR INSERT THAT TAKES PLACE ON ENAME FIELD OF EMP1 TABLE OF SCOTT USER SCHEMA. THE TRIGGER WILL MAKE THE ENTRIES OF ENAME FIELD IN UPPERCASE ONLY
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER SCOTT.TO_UPPER BEFORE INSERT OR UPDATE OF ENAME ON SCOTT.EMP1 FOR EACH ROW BEGIN :NEW.ENAME := UPPER(:NEW.ENAME); END; OUTPUT: Trigger created. SQL> INSERT INTO EMP1 (EMPNO,ENAME,JOB,SAL,DEPTNO) VALUES (7777,'JOHN','CLERK',1500,40); 1 row created. SQL> SELECT * FROM EMP1; EMPNO ENAME 7369 7499 7521 7566 7654 7698 7788 7839 7934 HIREDATE 17-DECSMITH CLERK 80 20-FEBALLEN SALESMAN 81 22-FEBWARD SALESMAN 81 02-APRJONES MANAGER 81 MARTIN SALESMAN 28-SEP-81 01-MAYBLAKE MANAGER 81 19-APRSCOTT ANALYST 87 17-NOVKING PRESIDENT 81 MILLER CLERK 23-JAN-82 JOB SAL 800 DEPTNO 20

1600 30 1250 30 2975 20 1250 30 2850 30 3000 20 5000 10 1300 10


58

7777

JOHN

Clerk

1500 40

27. CREATE A TRIGGER ON THE EMP1 TABLE, WHICH SHOWS THE OLD VALUE AND THE NEW VALUE OF THE ENAME AFTER ANY UPDATION ON ENAME OF EMP1 TABLE
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER EMP_UPDATE AFTER UPDATE OF ENAME ON EMP1 FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE ('OLD NAME:'||:OLD.ENAME); DBMS_OUTPUT.PUT_LINE ('NEW NAME:'||:NEW.ENAME); END; OUTPUT: Trigger created. SQL> UPDATE EMP1 SET ENAME='JOHN' WHERE EMPNO=7777; Old name: johny New name: john 1 row updated.

28. TRIGGER MAKING THE USE OF BOTH OLD AND NEW CORRELATION NAMES IN TRIGGER BODY AND IN TRIGGER RESTRICTION I.E IN WHEN CLAUSE. THE TRIGGER FIRES ONLY WHEN THE CONDITION IN THE WHEN CLAUSE RESULTS TRUE I.E WHEN THE DIFFERENCE BETWEEN NEW AND OLD VALUE OF SALARY FIELD BECOMES VE AND HENCE PRINTING THE DIFFERENCE
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER SCOTT.RESTRICTION_ON_SAL BEFORE UPDATE OF SAL ON SCOTT.EMPNEW FOR EACH ROW WHEN (NEW.SAL - OLD.SAL < 0) DECLARE DIFF NUMBER(5); BEGIN DIFF:= :NEW.SAL - :OLD.SAL; DBMS_OUTPUT.PUT('OLD SALARY: '||:OLD.SAL); DBMS_OUTPUT.PUT(' NEW SALARY: '||:NEW.SAL); DBMS_OUTPUT.PUT_LINE(' DIFFERENCE '||DIFF);
59

END; Output: Trigger created. SQL> UPDATE EMPNEW SET SAL=2000 WHERE DEPTNO=30; OLD SALARY: 2850 NEW SALARY: 2000 DIFFERENCE -850 6 rows updated.

29. TO AUTOMATE POPULATING THE EMP_DUP TABLE WHICH IS HAVING THE SAME STRUCTURE AS THAT OF EMP1 TABLE, THE FOLLOWING TRIGGER COULD BE PLACED ON EMP TABLE FOR THE PURPOSE OF BACKING UP THE DATA OF EMP TABLE INTO EMP_DUP TABLE WITHOUT GIVING INFORMATION TO THE USER OF EMP TABLE
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER SCOTT.EMP_DUP BEFORE INSERT ON SCOTT.EMP1 FOR EACH ROW BEGIN INSERT INTO EMP_DUP (EMPID, EMPNAME, DESG, SALARY, COMMISSION, HIREDATE, MGR_ID, DEPTID) VALUES(:NEW.EMPNO, :NEW.ENAME, :NEW.JOB, :NEW.SAL, :NEW.COMM, :NEW.HIREDATE, :NEW.MGR, :NEW.DEPTNO); END; Output: Trigger created. SQL> INSERT INTO EMP1 (EMPNO, ENAME, JOB, SAL, COMM, MGR, DEPTNO) VALUES (7771,RHODES,SALESMAN,2000,0,7070,40); 1 row created. SQL> ELECT * FROM EMP_DUP; SAL COMM HIREDATE MGRID DEPTID ----------------------------------------------------------------------------------------------------------------60

EMPID EMPNAME

DESG

7771 RHODES

SALESMAN

2000 0

7070

40

30. TRIGGER TO PRINT THE OPERATION PERFORMED ON ASSOCIATED TABLE


PL/SQL COMMAND: CREATE OR REPLACE TRIGGER PRINT_OPERATION BEFORE INSERT OR DELETE OR UPDATE ON SCOTT.EMP1 BEGIN IF INSERTING THEN DBMS_OUTPUT.PUT_LINE('User Has Performed Insertion Operation'); ELSIF DELETING THEN DBMS_OUTPUT.PUT_LINE('User Has Performed Deletion Operation'); ELSE DBMS_OUTPUT.PUT_LINE('User Has Performed Updation Operation'); END IF; END; Output: Trigger created. SQL> UPDATE EMP1 SET SAL=1800 WHERE EMPNO=7771; 1 row updated.

31. TO CREATE A TRIGGER ON THE EMP TABLE, WHICH STORE THE EMPNO AND OPERATION IN TABLE AUDITOR FOR EACH OPERATION I.E INSERT, UPDATE, AND DELETE
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER EMP_AUDIT AFTER INSERT OR UPDATE OR DELETE ON EMP FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO AUDITOR VALUES (:NEW.EMPNO,'INSERT'); ELSIF UPDATING THEN INSERT INTO AUDITOR VALUES (:NEW.EMPNO,'UPDATE'); ELSIF DELETING THEN INSERT INTO AUDITOR VALUES (:OLD.EMPNO,'DELETE'); END IF; END;

61

Output: Trigger created. SQL> INSERT INTO EMP (EMPNO, ENAME, JOB, SAL) VALUES (1111,'JONTY','CLERK',1200); 1 row created. SQL> DELETE FROM EMP WHERE ENAME='JONTY'; 1 row deleted. SQL> SELECT * FROM AUDITOR; EMPNO OPERATION ---------------------------------1111 INSERT 1111 DELETE

32. TO CREATE A TRIGGER SO THAT NO OPERATION CAN BE PERFORMED ON EMP TABLE ON SUNDAY
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER EMP1_SUNDAY BEFORE INSERT OR UPDATE OR DELETE ON EMP1 BEGIN IF RTRIM (UPPER (TO_CHAR(SYSDATE,'DAY'))) ='SUNDAY' THEN RAISE_APPLICATION_ERROR(-20022,'NO OPERATION CAN BE PERFORMED ON SUNDAY'); END IF; END; Output: Trigger created. SQL> UPDATE EMP1 SET SAL= 2000 WHERE DEPTNO=30; Update emp1 set sal= 2000 where deptno=30 * ERROR at line 1: ORA-20022: NO OPERATION CAN BE PERFORMED ON SUNDAY ORA-06512: at "SCOTT.EMP1_SUNDAY", line 3
62

ORA-04088: error during execution of trigger 'SCOTT.EMP1_SUNDAY'

33. TO CREATE A TRIGGER, WHICH VERIFY THAT UPDATED SALARY OF EMPLOYEE MUST BE GREATER THAN HIS/HER PREVIOUS SALARY
PL/SQL COMMAND: CREATE OR REPLACE TRIGGER UPDATE_CHECK BEFORE UPDATE ON EMPNEW FOR EACH ROW BEGIN IF :NEW.SAL<:OLD.SAL THEN RAISE_APPLICATION_ERROR(-20000,'NEW SALARY CANNOT BE LESS THAN OLD SAL'); END IF; END; Output: Trigger created. SQL> UPDATE EMPNEW SET SAL=2000 WHERE EMPNO=7902; Update empnew set sal=2000 where empno=7902 * ERROR at line 1: ORA-20000: NEW SALARY CANNOT BE LESS THAN OLD SAL ORA-06512: at "SCOTT.UPDATE_CHECK", line 3 ORA-04088: error during execution of trigger 'SCOTT.UPDATE_CHECK'.

63

CURSORS
34. PL/SQL PROGRAM FOR IMPLEMENTATION OF EXPLICIT CURSOR
EXAMPLE: CONSIDER A PL/SQL CODE TO DISPLAY THE EMPNO, ENAME, JOB OF EMPLOYEES OF DEPARTMENT NUMBER 10. PL/SQL COMMAND: DECLARE CURSOR C1 IS SELECT EMPNO, ENAME, JOB FROM EMP WHERE DEPTNO=10; REC C1%ROWTYPE; BEGIN OPEN C1; LOOP FETCH C1 INTO REC; EXIT WHEN C1 NOTFOUND; DBMS_OUTPUT.PUT_LINE(EMP NO: ||REC.EMPNO); DBMS_OUTPUT.PUT_LINE(ENAME: ||REC.ENAME); DBMS_OUTPUT.PUT_LINE(JOB: ||REC.JOB); END LOOP; CLOSE C1; END; OUTPUT: EMP NO: 7839 ENAME: KING JOB: PRESIDENT EMP NO: 7782 ENAME: CLARK JOB: MANAGER EMP NO: 7934 ENAME: MILLER JOB: CLERK PL/SQL procedure successfully completed.

64

Das könnte Ihnen auch gefallen