+ All Categories
Home > Documents > Plsql My Notes

Plsql My Notes

Date post: 08-Apr-2018
Category:
Upload: harsha-kotagiri
View: 233 times
Download: 0 times
Share this document with a friend

of 33

Transcript
  • 8/6/2019 Plsql My Notes

    1/33

  • 8/6/2019 Plsql My Notes

    2/33

    EMP_REC E_REC_T;

    BEGINSELECT EMPNO,ENAME,JOB,SAL INTO EMP_REC FROM EMP

    WHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE( EMP_REC.EMPNO ||' ' ||

    EMP_REC.ENAME ||' ' ||EMP_REC.JOB ||' ' ||EMP_REC.SAL );END;

    /

    1)A FUNCTIONALLY SIMILAR BLOCK, ADDING A DECLARATION SECTION

    DECLAREV_DATE VARCHAR2(10);BEGINV_DATE := SYSDATE;DBMS_OUTPUT.PUT_LINE(V_DATE);END;/

    2) DIFFERENT WAYS OF INITIALIZING THE VARIABLES IN THE DECLARATIONSECTION

    DECLARE

    V_NO NUMBER(2) :=10;V_NAME VARCHAR2(10) DEFAULT 'SAIBABA';V_SAL NUMBER(5) NOT NULL := 5000;V_JOB CONSTANT VARCHAR2(100) := 'MANAGING DIRECTOR OF ORACLE';

    BEGIN

    DBMS_OUTPUT.PUT_LINE(V_NO);DBMS_OUTPUT.PUT_LINE(V_NAME);DBMS_OUTPUT.PUT_LINE(V_SAL);DBMS_OUTPUT.PUT_LINE(V_JOB);

    END;

    /

    3) WAP TO PRINT THE FOLLOWING

    WELCOME TO PL/SQL PROGRAMMING

    DECLAREV_MESSAGE VARCHAR2(100) := 'WELCOME TO PL/SQL PROGRAMMING';

  • 8/6/2019 Plsql My Notes

    3/33

    BEGINDBMS_OUTPUT.PUT_LINE(V_MESSAGE);V_MESSAGE := 'WILSHIRE SOFTWARE TECHNOLOGIES';DBMS_OUTPUT.PUT_LINE(V_MESSAGE);DBMS_OUTPUT.PUT_LINE('HAI ');END;/

    4) WAP TO ACCEPT THE TEMP IN CENTIGRADE AND CONVERT IT INTO FARENHEITF=C*1.8+32

    DECLAREC NUMBER := &C;F NUMBER;

    BEGIN

    F := C*1.8+32;

    DBMS_OUTPUT.PUT_LINE('FARENHEIT=' || F);

    END;/

    5) WAP TO ACCEPT A SENTANCE AND COUNT THE NO. OF CHARACTERS IN THATSENTANCE

    DECLARESTR VARCHAR2(100) := '&STR';I NUMBER;

    BEGIN

    I := INSTR(STR,'.');

    I := LENGTH(STR);

    DBMS_OUTPUT.PUT_LINE('NO OF CHARACTERS=' || I);

    DBMS_OUTPUT.PUT_LINE('LENGTH = ' || I);

    END;

    /

    6)WAP TO ACCEPT THE TWO STRINGS AND CONCAT THE TWO STRINGS

    DECLARE

    STR VARCHAR2(20) := '&STR';

    STR1 VARCHAR2(20) := '&STR1';

  • 8/6/2019 Plsql My Notes

    4/33

    V VARCHAR2(40);

    BEGIN

    V := STR || ' , ' || STR1;

    DBMS_OUTPUT.PUT_LINE(V);

    END;

    /

    7) WAP TO ACCEPT THE MGR AND FIND HOW MANY EMPS ARE WORKING UNDER THATMGR

    DECLARE

    V_MGR NUMBER(4) := &V_MGR;

    N NUMBER :=0;

    BEGIN

    SELECT COUNT(*)INTO N

    FROM EMPWHERE MGR=V_MGR;

    DBMS_OUTPUT.PUT_LINE('NO OF EMPLOYEES = ' || N);

    END;

    /

    8) WAP TO ACCEPT 2 NO.S FIND THE REMAINDER WHEN THE FIRST NUMBER ISDIVIDED BY THE SECOND NUMBERDON'T USE THE MOD FUNCTION

    DECLARE

    A NUMBER := &A;

    B NUMBER := &B;

    C NUMBER ;

    M NUMBER ;

    BEGIN

  • 8/6/2019 Plsql My Notes

    5/33

    C := TRUNC (A/B);

    M := A-C*B;

    DBMS_OUTPUT.PUT_LINE('REMAINDER IS = ' || M);

    END;

    /

    9) USING THE MOD FUNCTION

    DECLARE

    A NUMBER := &A;

    B NUMBER := &B;

    C NUMBER;

    BEGIN

    C := MOD(A,B);

    DBMS_OUTPUT.PUT_LINE('REMAINDER = ' || C);

    END;

    /10) WAP TO ACCEPT THE TIME IN HH,MIN FORMAT AND FIND THE TOTAL SECONDS

    DECLARE

    H NUMBER := &HOUR;

    M NUMBER := &MINUTE;

    S NUMBER(10);

    BEGIN

    S := (H*60*60)+(M*60);

    DBMS_OUTPUT.PUT_LINE('TOTAL SECONDS = ' || S);

    END;

    /

    11) GO TO STATEMENT

    BEGIN

    GOTO SECOND_OUTPUT;

  • 8/6/2019 Plsql My Notes

    6/33

  • 8/6/2019 Plsql My Notes

    7/33

    /15) LOOPS

    DECLARE

    V_NAME VARCHAR2(10) := 'SAI';

    V_C NUMBER(2) :=0;

    BEGIN

    LOOP

    V_C := V_C+1;

    --DBMS_OUTPUT.PUT_LINE(V_NAME);

    EXIT WHEN V_C>10;

    --DBMS_OUTPUT.PUT_LINE(V_NAME);

    END LOOP;

    DBMS_OUTPUT.PUT_LINE(V_NAME);

    END;

    /

    16) WHILE LOOP

    WAP TO PRINT THE NUMBERS FROM 1 TO 10

    DECLARE

    v_N NUMBER(3):= 1;

    v_V VARCHAR2(100) ;

    BEGIN

    WHILE v_N

  • 8/6/2019 Plsql My Notes

    8/33

    BEGIN

    FOR I IN 1..10 LOOP

    DBMS_OUTPUT.PUT_LINE('HELLO');

    END LOOP;

    END;

    /18) FOR LOOP EXAMPLE

    DECLARE

    V_L NUMBER(2) :=1;

    V_H NUMBER(2) :=10;

    BEGIN

    FOR I IN V_L..V_H LOOP

    DBMS_OUTPUT.PUT_LINE('HELLO');

    END LOOP;

    END;

    /19) FOR LOOP EXAMPLE WITH BOND VALUE CHANGING

    DECLARE

    V_L NUMBER(2) :=1;

    V_H NUMBER(2) :=10;

    BEGIN

    FOR I IN V_L..V_H LOOP

    DBMS_OUTPUT.PUT_LINE('HELLO');

    V_L :=20;

    V_H :=40;

    END LOOP;

    END;

    /

    20) FOR LOOP PRINTING THE VALUES OF THE COUNTER

  • 8/6/2019 Plsql My Notes

    9/33

    BEGIN

    FOR I IN 1..10 LOOP

    DBMS_OUTPUT.PUT_LINE(I || 'HELLO');

    END LOOP;

    END;

    /

    21) %TYPE

    SYNTAX:

    IDENTIFIER TABLE.COLUMN_NAME%TYPE;

    DECLARE

    V_SAL EMP.SAL%TYPE;V_ENAME EMP.ENAME%TYPE;

    BEGIN

    SELECT SAL,ENAMEINTO V_SAL,V_ENAMEFROM EMPWHERE EMPNO=7369;DBMS_OUTPUT.PUT_LINE(V_ENAME || ' AND HIS SALARY IS ' || V_SAL);

    END;

    /22) WITH OUT USING %TYPE

    DECLARE

    V_SAL NUMBER(2);

    BEGIN

    SELECT SAL INTO V_SAL

    FROM EMPWHERE EMPNO=7369;

    DBMS_OUTPUT.PUT_LINE(V_SAL);

    END;

    /

  • 8/6/2019 Plsql My Notes

    10/33

    23) WITH OUT USING %TYPE

    DECLARE

    V_SAL VARCHAR2(10);

    BEGIN

    SELECT SAL INTO V_SAL

    FROM EMP

    WHERE EMPNO=7369;

    DBMS_OUTPUT.PUT_LINE(V_SAL);

    END;

    /

    24) %TYPE BASED ON THE PREVIOUSLY DEFINED VARIABLE

    DECLARE

    V_ENAME EMP.ENAME%TYPE;

    V_JOB V_ENAME%TYPE;

    BEGIN

    SELECT ENAME,JOB

    INTO V_ENAME,V_JOB

    FROM EMP

    WHERE EMPNO=7369;

    DBMS_OUTPUT.PUT_LINE(V_ENAME);

    END;

    /

    25) SYNTAXT FOR %ROWTYPE

    DECLARE

    IDENTFIER REFERENCE%ROWTYPE;

  • 8/6/2019 Plsql My Notes

    11/33

    WHERE

    IDENTIFIER IS THE NAME CHOOSEN FOR A RECORD AS A WHOLE

    REFERENCE IS THE NAME OF THE TABLE,VIEW, CURSOR OR CURSOR VARIABLE ONWHICHTHE RECORD IS BASED.

    TO REFERENCE AN INDIVIDUAL FIELD, WE USE DOT NOTATION

    FOR EXAMPLE:

    RECORD_NAME.FIELD_NAME;

    FOR EXAMPLE, YOU REFERENCE THE ENAME FIELD IN THE EMP_RECORD RECORD ASFOLLOWS

    EMP_RECORD.ENAME;

    YOU CAN THEN ASSIGN A VALUE TO THE RECORD FIELD AS FOLLOWS;

    EMP_RECORD.ENAME:='BOND';

    26) %ROWTYPE ATTRIBUTE

    --DECLARE A VARIABLE TO STORE THE INFORMATION ABOUT A DEPARTMENT FROMTHE--DEPT TABLE

    DEPT_RECORD DEPT%ROWTYPE;

    --DECLARE A VARIABLE TO STORE THE INFORMATION ABOUT AN EMPLOYEE FROMTHE--EMP TABLE

    EMP_RECORD EMP%ROWTYPE;

    27) ADVANTAGES OF USING %ROWTYPE

    THE NUMBER AND DATA TYPES OF THE UNDERLYING COLUMNS NEED NOT BE KNOWN.

    THE NUMBER AND DATA TYPES OF THE UNDERLYING DATABASE COLUMNS MAY CHANGEAT RUNTIME.

    THE ATTRIBUTE IS USEFULL WHEN RETRIEVING A ROW WITH THESELECT * STATMENT.28) %ROWTYPE WITH DEPT TABLE

    DECLARE

    DEPT_RECORD DEPT%ROWTYPE;

    BEGIN

  • 8/6/2019 Plsql My Notes

    12/33

    SELECT * INTO DEPT_RECORD

    FROM DEPT

    WHERE DEPTNO=10;

    DBMS_OUTPUT.PUT_LINE(DEPT_RECORD.DNAME);

    DBMS_OUTPUT.PUT_LINE(DEPT_RECORD.LOC);

    DBMS_OUTPUT.PUT_LINE(DEPT_RECORD.DEPTNO);

    END;

    /29) %ROWTYPE GETTING THE VALUES FROM OTHER TABLE CONCEPT

    DECLARE

    EMP_RECORD EMP%ROWTYPE;

    BEGIN

    SELECT *INTO EMP_RECORDFROM EMP1WHERE EMPNO=7369;

    DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);

    END;

    /30) CREATING A PL/SQL RECORD

    SYNTAX:

    TYPE type_name IS RECORD

    (field_declaration ...........);

    identifier type_name;

    WHERE field_declration is

    field_name (field_type | variable%type | table.column%type | table%rowtype )

    where

    TYPE_NAME IS THE NAME OF THE RECORD TYPE

    FIELD_NAME IS THE NAME OF A FIELD WITHIN THE RECORD

  • 8/6/2019 Plsql My Notes

    13/33

    FIELD_TYPE IS THE DATATYPE OF THE FIELD

    NOTE:- HERE WE CAN'T USE REF CURSOR

    31) VARIABLE%TYPE EXAMPLE

    DECLARE

    TYPE EMP_RECORD_TYPE IS RECORD

    (ENAME VARCHAR2(10),JOB ENAME%TYPE,SAL NUMBER(7,2),EMPNO SAL%TYPE);

    EMP_RECORD EMP_RECORD_TYPE;

    BEGIN

    SELECT ENAME,JOB,SAL,EMPNOINTO EMP_RECORDFROM EMPWHERE EMPNO=7369;

    DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);DBMS_OUTPUT.PUT_LINE(EMP_RECORD.EMPNO);

    END;

    /

    32) PL/SQL RECORD WITH %TYPE

    DECLARE

    TYPE EMP_RECORD_TYPE IS RECORD

    (EMPNO EMP.EMPNO%TYPE,ENAME EMP.ENAME%TYPE);

    EMP_RECORD EMP_RECORD_TYPE;

    BEGIN

    SELECT EMPNO,ENAME

    INTO EMP_RECORD

    FROM EMP

    WHERE EMPNO=7369;

  • 8/6/2019 Plsql My Notes

    14/33

  • 8/6/2019 Plsql My Notes

    15/33

    INDEX BY TABLES (PL/SQL TABLES)

    1) ARE COMPOSED OF TWO COMPONENTS

    A) PRIMARY KEY OF DATA TYPE BINARY_INTEGER.

    B) COLUMN OF SCALAR OR RECORD DATA TYPE

    NOTE:-

    1) CAN INCREASE IN SIZE DYNAMICALLY BECAUSE THEY ARE UNCONSTRAINED

    2) OBJECTS OF THE TABLE TYPE ARE CALLED INDEX BY TABLES

    3) THEY ARE MODELED AS (BUT NOT THE SAME AS) DATABASE TABLES

    4) INDEX BY TABLES USE A PRIMARY KEY TO PROVIDE YOU WITH ARRAY-LIKEACCESS TO

    ROWS

    5) SIMPLY WE CAN SAY INDEX BY TABLE IS JUST LIKE A ARRAY

    36) - SYNTAX:

    TYPE TYPE_NAME IS TABLE OF

    COLUMN_TYPE | VARIABLE%TYPE | TABLE.COLUMN%TYPE | TABLE%ROWTYPE

    INDEX BY BINARY_INTEGER;

    IDENTIFIER TYPE_NAME;

    INDEX BY TABLE STRUCURE

    UNIQUE IDENTIFIER COLUMN

    1 JONES2 SMITH3 MADURO

    BINARY_INTEGER SCALAR

    NOTE:-

    1) THE COLUMNS CANNOT BE NAMED

    2) WE CANNOT INITIALIZE AN INDEX BY TABLE IN ITS DECLARATION.

    3) AN INDEX BY TABLE IS NOT POPULATED AT THE TIME OF THE DECLARATION

    4) IT CONTAINS NO KEYS OR NO VALUES

  • 8/6/2019 Plsql My Notes

    16/33

    5) AN EXPLICIT EXECUTABLE STATMENT IS REQUIRED TO INITIALIZE(POPULATE)THE

    INDEX BY TABLE

    37) --EXAMPLE OF INDEX BY TABLE OF RECORDS

    DECLARE

    TYPE EMP_TABLE_TYPE IS TABLE OFEMPLOYEES%ROWTYPEINDEX BY BINARY_INTEGER;

    MY_EMP_TABLE EMP_TABLE_TYPE;V_COUNT NUMBER(2) :=4;

    BEGIN

    FOR I IN 1..V_COUNT LOOP

    SELECT * INTOMY_EMP_TABLE(I)FROM EMPLOYEESWHERE EMPNO=I;

    dbms_output.put_line(my_emp_table(i).ename);

    END LOOP;

    --FOR I IN MY_EMP_TABLE.FIRST..MY_EMP_TABLE.LAST LOOP

    --DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE(I).ENAME);--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE.COUNT);--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE.NEXT(1);--DBMS_OUTPUT.PUT_LINE(MY_EMP_TABLE.PRIOR(3);

    --END LOOP;

    IF MY_EMP_TABLE.EXISTS(1) THENDBMS_OUTPUT.PUT_LINE('FIRST RECORD IS EXISTING');

    END IF;

    END;

    38) NOTE:- IN SCALAR IT'S NOT POSSIBLE TO DISPLAY THE VALUE-- ONLY WE CAN MAKE A DECISION BY USING EXISTS METHOD

    DECLARE

  • 8/6/2019 Plsql My Notes

    17/33

    TYPE ENAME_TABLE_TYPE IS TABLE OF

    EMPLOYEES.ENAME%TYPE

    INDEX BY BINARY_INTEGER;

    ENAME_TABLE ENAME_TABLE_TYPE;

    BEGIN

    FOR I IN 1..10 LOOP

    SELECT ENAME INTO ENAME_TABLE(I) FROM EMPLOYEESWHERE EMPNO=I;--dbms_output.put_line(ename_table(i).ename);

    END LOOP;

    IF ENAME_TABLE.EXISTS(1) THENDBMS_OUTPUT.PUT_LINE('IT EXISTS');

    END IF;

    END;

    /

    39) NOTE:- IN SCALAR IT'S NOT POSSIBLE TO DISPLAY THE VALUE-- ONLY WE CAN MAKE A DECISION BY USING EXISTS METHOD

    DECLARE

    TYPE ENAME_TABLE_TYPE IS TABLE OF

    EMPLOYEES.ENAME%TYPE

    INDEX BY BINARY_INTEGER;

    ENAME_TABLE ENAME_TABLE_TYPE;

    BEGIN

    FOR I IN 1..10 LOOP

    SELECT ENAME INTO ENAME_TABLE(I) FROM EMPLOYEESWHERE EMPNO=I;--dbms_output.put_line(ename_table(i).ename);

    END LOOP;

    IF ENAME_TABLE.EXISTS(1) THENDBMS_OUTPUT.PUT_LINE('IT EXISTS');END IF;

    END;

    /40) INDEX BY TABLE METHODS

  • 8/6/2019 Plsql My Notes

    18/33

  • 8/6/2019 Plsql My Notes

    19/33

    1) IMPLICIT CURSORS2) EXPLICIT CURSORS

    IMPLICIT CURSORS:- DECLARED FOR ALL DML, PL/SQL SELECT STATEMENTS

    EXPLICIT CURSORS:- DECLARED AND NAMED BY THE PROGRAMMER

    NOTE:- THE ORACLE SERVER USES WORK AREAS, CALLED PRIVATE SQL AREAS,TO EXECUTE SQL STATEMENTS AND TO STORE PROCESSING INFORMATION

    YOU CAN USE PL/SQL CURSORS TO NAME A PRIVATE SQL AREA ANDACCESS ITS STORED INFORMATION

    IMPLICIT CURSORS:- IMPLICIT CURSORS ARE DECLARED BY THE PL/SQLIMPLICITYLY

    FOR ALL DML AND PL/SQL SELECT STATEMENTS, INCLUDINGQUERIES

    THAT RETURN ONLY ONE ROW.

    EXPLICIT CURSORS:- FOR QUERIES THAT RETURN MORE THAN ONE ROW, EXPLICITCURSORS

    ARE DECLARED AND NAMED BY THE PROGRAMMER AND MANIPULATEDTHROUGH SPECIFIC STATEMENTS IN THE BLOCK'S EXECUTABLE

    ACTIONS

    CONTROLLING EXPLICIT CURSORS STEPS

    1) OPEN THE CURSOR2) FETCH A ROW3) CLOSE THE CURSOR

    EXPLICIT CURSOR ATTRIBUTES:-

    ARE USED TO OBTAIN STATUS INFORMATION ABOUT A CURSOR

    ATTRIBUTES:-

    %ISOPEN BOOLEAN%NOTFOUND BOOLEAN%FOUND BOOLEAN%ROWCOUNT NUMBER

    %ISOPEN:- EVALUATES TO TRUE IF THE CURSOR IS OPEN%NOTFOUND:- EVALUATES TO TRUE IF THE MOST RECENT FETCH DOES NOT RETURNA ROW%FOUND:- EVALUATES TO TRUE IF THE MOST RECENT FETCH RETURNS A ROW;

    COMPLIMENT OF %NOTFOUND%ROWCOUNT:- EVALUATES TO THE TOTAL NUMBER OF ROWS RETURNED SO FAR

    NOTE:- WE CANNOT REFERENCE CURSOR ATTRIBUTES DIRECTLY IN A SQL STATEMENT

  • 8/6/2019 Plsql My Notes

    20/33

  • 8/6/2019 Plsql My Notes

    21/33

  • 8/6/2019 Plsql My Notes

    22/33

    DBMS_OUTPUT.PUT_LINE(V_ENAME);EXIT WHEN EMP_CURSOR%FOUND;END LOOP;CLOSE EMP_CURSOR;

    END;

    /45) %IS OPEN ATTRIBUTE

    DECLARECURSOR EMP_CURSOR IS SELECT EMPNO FROM EMP;V_EMPNO EMP.EMPNO%TYPE;

    BEGIN

    IF NOT EMP_CURSOR%ISOPEN THENOPEN EMP_CURSOR;END IF;

    LOOP

    FETCH EMP_CURSOR INTO V_EMPNO;

    DBMS_OUTPUT.PUT_LINE(V_EMPNO);

    EXIT WHEN EMP_CURSOR%NOTFOUND;

    END LOOP;

    END;

    /46) CURSORS AND RECORDS

    DECLARECURSOR EMP_CURSOR IS SELECT * FROM EMP;EMP_RECORD EMP_CURSOR%ROWTYPE;

    BEGIN

    OPEN EMP_CURSOR;LOOP

    FETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);

    EXIT WHEN EMP_CURSOR%NOTFOUND;

    END LOOP;

    CLOSE EMP_CURSOR;

    END;

    /

  • 8/6/2019 Plsql My Notes

    23/33

    SYNTAX:-

    FOR RECORD_NAME IN CURSOR_NAME LOOPSTATEMENT1;STATEMENT2;END LOOP;

    NOTE:-

    1) THE CURSOR FOR LOOP IS A SHORTCUT TO PROCESS EXPLICIT CURSORS2) IMPLICIT OPEN,FETCH,EXIT AND CLOSE OCCUR.3) THE RECORD IS IMPLICITLY DECLARED

    A CURSOR FOR LOOP PROCESS ROWS IN AN EXPLICIT CURSOR.IT IS A SHORTCUT BECAUSE THE CURSOR IS OPENED ,ROWS ARE FETCHED ONCE FOR EACH ITERATION IN THE LOOP,THE LOOP EXITS WHEN THE LAST ROWS IS PROCESSED,AND THE CURSOR IS CLOSED AUTOMATICALLY.

    THE LOOP IS TERMINATED AUTOMATICALLY AT THE END OF THE ITERATION

    NOTE:- DO NOT USE THE CURSOR FOR LOOPWHEN THE CURSOR OPERATION MUST BE HANDLED EXPLICITLY

    48) CURSOR FOR LOOP EXAMPLE

    DECLARECURSOR EMP_CURSOR IS SELECT ENAME,DEPTNO FROM EMP;BEGINFOR EMP_RECORD IN EMP_CURSOR LOOPIF EMP_RECORD.DEPTNO=10 THENDBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);END IF;END LOOP;END;/

    49) CURSOR FOR LOOPS USING SUBQUERIES

    -- NOTE:- NO NEED TO DECLARE THE CURSOR

    BEGIN

    FOR EMP_RECORD IN (SELECT * FROM EMP) LOOP

    IF EMP_RECORD.DEPTNO=10 THENDBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);END IF;

    END LOOP;

    END;

  • 8/6/2019 Plsql My Notes

    24/33

    /50) ADVANCED EXPLICIT CURSOR CONCEPTS

    1) CURSORS WITH PARAMETERS2) THE FOR UPDATE CLAUSE3) THE WHERE CURRENT OF CLAUSE

    A) CURSORS WITH PARAMETERS

    SYNTAX:-

    CURSOR CURSOR_NAME (PARAMETER_NAME DATATYPE, PARAMETER_NAME1DATATYPE.....)ISSELECT STATEMENT;

    PASS PARAMETER VALUES TO A CURSOR WHEN THE CURSOR IS OPENED AND THEQUERY

    IS EXECUTED

    OPEN AN EXPLICIT CURSOR SEVERAL TIMES WITH A DIFFERENT ACTIVE SET EACHTIME

    EG:- OPEN CURSOR_NAME(PARAMETER_VALUE....);

    NOTEPOINT:-

    IT IS POSSIBLE TO TERMINATE THE PL/SQL BLOCK WITHOUT CLOSING THECURSORS,BUT WE SHOULD MAKE IT A HABIT TO CLOSE ANY CURSOR THAT YOU DECLAREEXPLICITYLY TO FREE UP RESOURCES

    THERE IS A MAXIMUM LIMIT TO THE NUMBER OF OPEN CURSORS PER USER,WHICH IS DETERMINED BY THE OPEN_CURSORS PARAMETER IN THE DATABASEPARAMETER FILE.

    FOR EG:- OPEN_CURSORS=50 BY DEFAULT51) SIMPLE CURSOR EXAMPLE WITH OUT PASSING ANY PARAMETER-- NOTE POINT:- ALWAYS USE CURSORNAME IN FETCH STATEMENT--FETCH STATEMENT IS ALWAYS USED WITH CURSORS ONLY

    DECLARECURSOR EMP_CURSOR ISSELECT * FROM EMP

    WHERE DEPTNO=10;EMP_RECORD EMP_CURSOR%ROWTYPE;

    BEGINOPEN EMP_CURSOR;LOOPFETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);EXIT WHEN EMP_CURSOR%NOTFOUND;END LOOP;

  • 8/6/2019 Plsql My Notes

    25/33

    CLOSE EMP_CURSOR;END;/

    52) CURSOR WITH PARAMETERS-- FOR PARAMETER DATA TYPE WE SHOULD NOT SPECIFY THE SIZE-- I.E. THE SIZE SHOULD NOT BE CONSTRAINED(NO RESTRICTION ON SIZE)

    DECLARE

    CURSOR EMP_CURSOR(P_DEPTNO NUMBER) ISSELECT * FROM EMPWHERE DEPTNO=P_DEPTNO;

    EMP_RECORD EMP_CURSOR%ROWTYPE;

    BEGIN

    OPEN EMP_CURSOR(10);LOOP

    FETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE('THESE EMPLOYEES ARE WORKING IN DEPT10');DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);DBMS_OUTPUT.PUT_LINE('----------------------------');EXIT WHEN EMP_CURSOR%NOTFOUND;END LOOP;CLOSE EMP_CURSOR;

    OPEN EMP_CURSOR(20);LOOPFETCH EMP_CURSOR INTO EMP_RECORD;DBMS_OUTPUT.PUT_LINE('THESE EMPLOYEES ARE WORKING IN DEPT20');DBMS_OUTPUT.PUT_LINE(EMP_RECORD.ENAME);EXIT WHEN EMP_CURSOR%NOTFOUND;END LOOP;CLOSE EMP_CURSOR;

    END;

    /53) THE FOR UPDATE CLAUSE

    SYNTAX:-

    SELECT ........FROM

    FOR UPDATE [OF COLUMN_REFERENCE] [NOWAIT];

    1) USE EXPLICIT LOCKING TO DENY ACCESS FOR THE DURATION OF ATRANSACTION.2) LOCK THE ROWS BEFORE THE UPDATE OR DELETE.

    COLUMN_REFERENCE:-1) IS A COLUMN IN THE TABLE AGAINST THE QUERY IS PROCESSED2) A LIST OF COLUMNS MAY ALSO BE USED

  • 8/6/2019 Plsql My Notes

    26/33

    NOWAIT:- RETURNS AN ORACLE ERROR IF THE ROWS ARE LOCKED BY ANOTHERSESSION

    NOTE:- FOR UPDATE CLAUSE IS THE LAST CLAUSE IN A SELECT STATEMENT, EVENAFTER THE ORDER BY, IF ONE EXISTS.

    FOR UPDATE OF COL_NAMES(S) LOCKS ROWS ONLY IN TABLES THAT CONTAIN THECOL_NAMES(S)

    NOWAIT:- IT TELLS ORACLE NOT TO WAIT IF REQUESTED ROWS HAVE BEEN LOCKEDBYANOTHER USER

    CONTROL IS IMMEDIATELY RETURNED TO YOUR PROGRAMM SO THAT IT CAN DOOTHER WORKBEFORE TRYING AGAIN TO ACQUIRE THE LOCK.

    IF YOU OMIT THE NOWAIT KEYWORD, ORACLE WAITS UNTIL THE ROWS AREAVAILABLE

    NOTE:- IF THE ORACLE SERVER CANNOT ACQUIRE THE LOCKS ON THE ROWS ITNEEDS IN ASELECT FOR UPDATE, IT WAITS INDEFINITELY.54) THE WHERE CURRENT OF CLAUSE

    SYNTAX :-

    WHERE CURRENT OF CURSOR;

    USE CURSORS TO UPDATE OR DELETE THE CURRENT ROW.

    INCLUDE THE FOR UPDATE CLAUSE IN THE CURSOR QUERY TO LOCK THE ROWS FIRST

    USE THE WHERE CURRENT OF CLAUSE TO REFERENCE THE CURRENT ROW FROM AN

    EXPLICIT CURSOR

    CURSOR:- IS THE NAME OF A DECLARE CURSOR (THE CURSOR MUST HAVE BEENDECLAREDWITH THE FOR UPDATE CLAUSE)

    NOTE:- THE WHERE CURRENT OF CLAUSE IS USED TO UPDATE OR DELETE THECURRENT ROWBEING ADDRESSED WITHOUT THE NEED TO EXPLICITLY REFERENCE THE ROWID

    55) EXAMPLE

    DECLARECURSOR SAL_CURSOR ISSELECT SAL FROM EMPWHERE DEPTNO=10FOR UPDATE OF SAL NOWAIT;

    BEGIN

  • 8/6/2019 Plsql My Notes

    27/33

    FOR EMP_RECORD IN SAL_CURSOR LOOP

    IF EMP_RECORD.SAL

  • 8/6/2019 Plsql My Notes

    28/33

    STATEMENT1;

    EXCEPTION:- IS THE STANDARD NAME OF A PREDEFINED EXCEPTION ORTHE NAME OF A USER DEFINED EXCEPTION DECLARED WITH IN THEDECLARATIVE SECTION

    STATEMENT:- IS ONE OR MORE PL/SQL OR SQL STATEMENTS

    OTHERS :- IS AN OPTIONAL EXCEPTIONAL-HANDLING CLAUSE THAT TRAPSUNSPECIFIED

    EXCEPTIONS

    NOTE:- THE OTHERS HANDLER TRAPS ALL EXCEPTIONS NOT ALREADY TRAPPED.SOME ORACLE TOOLS HAVE THEIR OWN PREDEFINED EXCEPTIONS THAT YOU

    CANRAISE TO CAUSE EVENTS IN THE APPLICATION.THE OTHERS HANDLER CAN ALSO TRAP THESE EXCEPTION

    TRAPPING EXCEPTIONS GUIDELINES

    THE EXCEPTION KEYWORD STARTS EXCEPTION-HANDLING SECTIONSEVERAL EXCEPTION HANDLERS ARE ALLOWEDONLY ONE HANDLER IS PROCESSED BEFORE LEAVING THE BLOCKWHEN OTHERS IS THE LAST CLAUSEYOU CAN HAVE ONLY ONE OTHERS CLAUSEEXCEPTIONS CANNOT APPEAR IN ASSIGNMENT STATEMENTS OR SQL STATEMENTS

    SAMPLE PREDEFINED EXCEPTIONS

    NO_DATA_FOUNDTOO_MANY_ROWSINVALID_CURSORZERO_DIVIDEDUP_VAL_ON_INDEX

    NO_DATA_FOUND :- SINGLE ROW RETURNED NO DATATOO_MANY_ROWS :- SINGLE-ROW SELECT RETURNED MORE THAN ONE ROWINVALID_CUROSR :- ILLEGAL CURSOR OPERATION OCCUREDZERO_DIVIDE :- ATTEMPTED TO DIVIDE BY ZERODUP_VAL_ON_INDEX ATTEMPTED TO INSERT A DUPLICATE VALUE

    56) NO_DATA_FOUND EXCEPTION

    DECLAREV_NAME VARCHAR2(25);BEGINSELECT ENAMEINTO V_NAMEFROM EMPWHERE EMPNO=2;END;/

  • 8/6/2019 Plsql My Notes

    29/33

    57) NO_DATA_FOUND EXCEPTION HANDLING

    DECLARE

    V_NAME VARCHAR2(20);

    V_NO NUMBER(10);BEGIN

    SELECT ENAMEINTO V_NAMEFROM EMPWHERE EMPNO=2;

    EXCEPTION

    WHEN NO_DATA_FOUND THEN

    --select sal into v_no--from emp--where empno=7369;

    v_no := 10000;

    DBMS_OUTPUT.PUT_LINE(V_NO);END;

    /

    58) TOO_MANY_ROWS

    DECLARE

    V_ENAME VARCHAR2(10);

    BEGIN

    SELECT ENAME INTO V_ENAMEFROM EMP;

    EXCEPTIONWHEN TOO_MANY_ROWS THENDBMS_OUTPUT.PUT_LINE('A VARIABLE CAN HOLD ONLY SINGLE VALUE AT A TIME');

    END;

    /59) ZERO_DIVIDE

    DECLARE

    V_NO NUMBER(5) := 10;

  • 8/6/2019 Plsql My Notes

    30/33

    V_NO1 NUMBER(5) :=0;

    V_RES NUMBER(5);

    BEGIN

    V_RES := (V_NO/V_NO1);

    EXCEPTION

    WHEN ZERO_DIVIDE THEN

    DBMS_OUTPUT.PUT_LINE('UNDEFINED VALUE');

    END;

    /

    60) INVALID CURSOR

    DECLARE

    CURSOR EMP_CURSOR IS SELECT * FROM EMP;

    EMP_RECORD EMP_CURSOR%ROWTYPE;

    BEGIN

    --LOOP

    --FETCH EMP_CURSOR INTO EMP_RECORD;--EXIT WHEN EMP_CURSOR%NOTFOUND;--END LOOP;

    CLOSE EMP_CURSOR;

    EXCEPTION

    WHEN INVALID_CURSOR THEN

    DBMS_OUTPUT.PUT_LINE('NOT OPENED CURSOR TILL YET');

    END;

    /

    61) DUP_VAL_ON_INDEX EXCEPTION

    BEGIN

    INSERT INTO AVALUES(1);

  • 8/6/2019 Plsql My Notes

    31/33

    EXCEPTION

    WHEN DUP_VAL_ON_INDEX THEN

    DBMS_OUTPUT.PUT_LINE('PRIMARY KEY VIOLATION');

    END;

    /

    62) NON PREDEFINED ERROR

    DECLARE

    V_SAL NUMBER(2);

    BEGIN

    SELECT SAL INTO V_SAL

    FROM EMP

    WHERE EMPNO=7369;

    DBMS_OUTPUT.PUT_LINE(V_SAL);

    END;

    /

    63) TRAP FOR ORACLE SERVER ERROR NUMBER -6502, AN VALUE TOO LARGE

    DECLARE

    V_SAL NUMBER(2);

    E_HIGH EXCEPTION;

    PRAGMA EXCEPTION_INIT(E_HIGH,-6502);

    BEGIN

    SELECT SALINTO V_SAL

    FROM EMPWHERE EMPNO=7369;

    EXCEPTION

    WHEN E_HIGH THENDBMS_OUTPUT.PUT_LINE('VALUE TOO HIGH');

    END;

  • 8/6/2019 Plsql My Notes

    32/33

    /

    64) TRAP FOR ORACLE SERVER ERROR NUMBER -2292 , AN INTEGRITY CONSTRAINT-- VIOLATION

    FUNCTIONS FOR TRAPPING EXCEPTION

    SQLCODE:- RETURNS THE NUMERIC VALUE FOR THE ERROR CODE

    SQL CODE VALUE :-

    0 NO EXCEPTION ENCOUNTERED

    1 USER-DEFINED EXCEPTION

    +100 NO_DATA_FOUND EXCEPTION

    NEGATIVE NUMBER ANOTHER ORACLE SERVER ERROR NUMBER

    SQLERRM :- RETURNS THE MESSAGE ASSOCIATED WITH THE ERROR NUMBER

    65) FUNCTIONS FOR TRAPPING EXCEPTIONS

    DECLARE

    V_ERROR_NUMBER NUMBER;

    V_ERROR_MESSAGE VARCHAR2(255);

    V_SAL NUMBER(9);

    v_high exception;

    pragma exception_init(v_high,-6502);

    BEGIN

    SELECT SAL INTO V_SALFROM EMPWHERE EMPNO=7369;

    v_error_number := sqlcode;v_error_message := sqlerrm;

    dbms_output.put_line(v_error_number);

    EXCEPTION

    --WHEN NO_DATA_FOUND THEN

  • 8/6/2019 Plsql My Notes

    33/33


Recommended