Tuesday, February 25, 2014

What is Collection and its type with Example


Collection:-
            Collection is an Ordered group of elements, all of the same type.
           
Attributes of Collection

1.  FIRST
2.  LAST
3.  COUNT
4.  DELETE
5.  EXTAND
6.  TRIM
7.  NEXT
8.  EXIST
9.  PRIOR
10. LIMIT           
   
   
Types of Collection

1.  Varray
2.  Nested Table
3.  PL/SQL Table or Associate Array




Varray:-
        Varray stands of variable size array.Varray can be stored in the column of table.
       
Syntax of Varray:- Type type_name is VARRAY(length) of data_type;

Examples of Varray
   
   
1.

    DECLARE
     TYPE L_VAR IS VARRAY(10) OF VARCHAR2(3);
     L_VAR1 L_VAR;
    BEGIN
        L_VAR1:=L_VAR('A','B','C','D','E','F','G','H');
        FOR I IN 1..8
        LOOP
            DBMS_OUTPUT.PUT_LINE(L_VAR1(I));
        END LOOP;
     END;
   
   
2.

     DECLARE
     TYPE L_VAR IS VARRAY(10) OF VARCHAR2(3);
     L_VAR1 L_VAR;
    BEGIN
        L_VAR1:=L_VAR('A','B','C','D','E','F','G','H');
        FOR I IN L_VAR1.FIRST..L_VAR1.COUNT
        LOOP
            DBMS_OUTPUT.PUT_LINE(L_VAR1(I));
        END LOOP;
     END;
   

3.   

    DECLARE
     TYPE L_VAR IS VARRAY(10) OF VARCHAR2(10);
     L_VAR1 L_VAR:= L_VAR();
    BEGIN
        L_VAR1.EXTEND;
        L_VAR1(1):='HELLO';
        L_VAR1.EXTEND;
        L_VAR1(2):= 'ORACLE';
        L_VAR1.EXTEND;
        L_VAR1(3):='JAVA';
        L_VAR1.EXTEND;
        L_VAR1(4):= 'OAF';
        FOR I IN 1..4
        LOOP
            DBMS_OUTPUT.PUT_LINE(L_VAR1(I));
        END LOOP;  
     END;
   
   
4.

    DECLARE
     CURSOR C1 IS
            SELECT PO_HEADER_ID
            FROM PO_HEADERS_ALL
            WHERE ROWNUM<=100;
     TYPE L_HDR IS VARRAY(100) OF PO_HEADERS_ALL.PO_HEADER_ID%TYPE;
     L_HDR1 L_HDR:= L_HDR();
     COUNTER NUMBER:=0;           
    BEGIN
     FOR I IN C1
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR1.EXTEND;
        L_HDR1(COUNTER):= I.PO_HEADER_ID;
        DBMS_OUTPUT.PUT_LINE('PO_HEADER_ID IS '||L_HDR1(COUNTER));
     END LOOP;
    END;
   
   
5.

    DECLARE
     CURSOR C1 IS
                SELECT PO_HEADER_ID
                FROM PO_HEADERS_ALL
                WHERE ROWNUM<=100;
     TYPE L_HDR IS VARRAY(100) OF PO_HEADERS_ALL.PO_HEADER_ID%TYPE;
     L_HDR1 L_HDR:=L_HDR();
     COUNTER NUMBER:=0;           
    BEGIN
     OPEN C1;
     FOR I IN 1..100
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR1.EXTEND;
        FETCH C1 INTO L_HDR1(COUNTER);
        DBMS_OUTPUT.PUT_LINE('PO_HEADER_ID IS '||L_HDR1(COUNTER));
     END LOOP;
    END;
   
   
Nested Table:- 
                Nested table is like a one-dimensional array.
               
Syntax of Nested Table:-   TYPE type_name IS TABLE OF data_type;


Example of Nested Table

1.

    DECLARE
     TYPE L_TAB IS TABLE OF NUMBER;
     L_TAB1 L_TAB;
    BEGIN
     L_TAB1:= L_TAB(1,2,3,4,5);
     FOR I IN 1..5
     LOOP
        DBMS_OUTPUT.PUT_LINE(L_TAB1(I));
     END LOOP;
    END;
   
   
2.

    DECLARE
     TYPE L_TAB IS TABLE OF NUMBER;
     L_TAB1 L_TAB;
    BEGIN
     L_TAB1:= L_TAB(1,2,3,4,5);
     FOR I IN L_TAB.FIRST..L_TAB1.LAST
     LOOP
        DBMS_OUTPUT.PUT_LINE(L_TAB1(I));
     END LOOP;
    END;
   
   
3.

    DECLARE
     CURSOR C_HDR IS
                    SELECT PO_HEADER_ID
                    FROM PO_HEADERS_ALL
                    WHERE ROWNUM<=100;
     TYPE L_TAB_HDR IS TABLE OF PO_HEADERS_ALL.PO_HEADER_ID%TYPE;
     L_HDR L_TAB_HDR:= L_TAB_HDR();            
     COUNTER NUMBER:=0;
    BEGIN
     FOR I IN C_HDR
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR.EXTEND;
        L_HDR(COUNTER):= I.PO_HEADER_ID;
        DBMS_OUTPUT.PUT_LINE(L_HDR(COUNTER));
     END LOOP;
END;


4.

    DECLARE
     CURSOR C_HDR IS
                    SELECT PO_HEADER_ID
                    FROM PO_HEADERS_ALL
                    WHERE ROWNUM<=100;
     TYPE L_TAB_HDR IS TABLE OF PO_HEADERS_ALL.PO_HEADER_ID%TYPE;
     L_HDR L_TAB_HDR:= L_TAB_HDR();            
     COUNTER NUMBER:=0;
    BEGIN
     OPEN C_HDR;
     FOR I IN 1..100
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR.EXTEND;
        FETCH C_HDR INTO L_HDR(COUNTER);
        DBMS_OUTPUT.PUT_LINE(L_HDR(COUNTER));
     END LOOP;
    END;


5.

    DECLARE
     CURSOR C_HDR IS
                    SELECT *
                    FROM PO_HEADERS_ALL
                    WHERE ROWNUM<=100;
     TYPE L_TAB_HDR IS TABLE OF PO_HEADERS_ALL%ROWTYPE;
     L_HDR L_TAB_HDR:= L_TAB_HDR();            
     COUNTER NUMBER:=0;
    BEGIN
     OPEN C_HDR;
     FOR I IN 1..100
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR.EXTEND;
        FETCH C_HDR INTO L_HDR(COUNTER);
        DBMS_OUTPUT.PUT_LINE('HEADER ID'||CHR(9)||L_HDR(COUNTER).PO_HEADER_ID||CHR(9)||'PO NUMBER'||CHR(9)||L_HDR(COUNTER).SEGMENT1);
     END LOOP;
    END;

   
   
PL/SQL Table:-
            PL/SQL Table helps you moves bulk data. They can store column or rows od Oracle Data.
              
 Syntax:- TYPE type_name is TABLE OF data_type
                 INDEX BY NUMBER/VARCHAR2/PLS_INTRGER/BINARY_INTEGER;
              
Example:-

1.

    DECLARE
     TYPE L_TAB IS TABLE OF NUMBER
     INDEX BY PLS_INTEGER;
     L_TAB1 L_TAB;
    BEGIN
     L_TAB1(1):=1;
     L_TAB1(2):=2;
     L_TAB1(3):=3;
     L_TAB1(4):=4;
     L_TAB1(5):=5;
     FOR I IN L_TAB1.FIRST..L_TAB1.LAST
     LOOP
        DBMS_OUTPUT.PUT_LINE(L_TAB1(I));
     END LOOP;
    END;              

   
2.

    DECLARE
     CURSOR C_HDR IS
                    SELECT PO_HEADER_ID,SEGMENT1
                    FROM PO_HEADERS_ALL
                    WHERE ROWNUM<=100;
     TYPE L_TAB_HDR IS TABLE OF PO_HEADERS_ALL.SEGMENT1%TYPE
     INDEX BY PLS_INTEGER;
     L_HDR L_TAB_HDR;            
     COUNTER NUMBER:=0;
    BEGIN
     FOR I IN C_HDR
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR(COUNTER):= I.SEGMENT1;
        DBMS_OUTPUT.PUT_LINE(L_HDR(COUNTER));
     END LOOP;
    END;
   
   
3.

    DECLARE
     CURSOR C_HDR IS
                    SELECT PO_HEADER_ID,SEGMENT1
                    FROM PO_HEADERS_ALL
                    WHERE ROWNUM<=100;
     TYPE L_TAB_HDR IS TABLE OF PO_HEADERS_ALL.SEGMENT1%TYPE
     INDEX BY PLS_INTEGER;
     L_HDR L_TAB_HDR;            
     COUNTER NUMBER:=0;
    BEGIN
     FOR I IN C_HDR
     LOOP
        COUNTER:= COUNTER+1;
        L_HDR(COUNTER):= I.SEGMENT1;
     END LOOP;
     FOR J IN 1..COUNTER
     LOOP
        DBMS_OUTPUT.PUT_LINE(L_HDR(J));
     END LOOP;
    END;



Thanks
Sajal

1 comment: