Oracle interview questions

                   


PL/SQL Table and Nested Table




 Introduction:


As you know, a datatype is used to classify the data to be stored as number, varchar, boolean etc. But a varible declared using a dataype can hold only a single data value at a time, i.e a single memory location.

 

What if we need to store multiple rows of data in a single variable? There comes the use of collections in Oracle. A variable declared as a collection could store an

 array of data of the same TYPE or ROWTYPE. This is beneficial when we need to pass multiple rows of data between Procedures or need to return multiple records

from functions especially to other languages like Java, C etc.

 

These are the main classifications:

 

1.      PL/SQL TABLE (index-by tables) or NESTED TABLE

2.      VARRAY

3.      RECORD

4.      OBJECT

 

Here I am discussing PL/SQL TABLE (index-by tables) and NESTED TABLE in detail

 

1. PL/SQL TABLE (index-by tables) and NESTED TABLE

 

            These are single-column tables and could be considered as an Array of data but which is unbounded; i.e we cannot set a limit on number of rows like an array

 and that s sometimes an added advantage.

 

Both PL/SQL TABLE and NESTED TABLE has got the same structure and all, but the main difference is, nested tables could be stored in a database

column whereas PL/SQL tables could not be. To explain further,  Nested table Dataypes can be created standalone they could be used for columns in normal database Tables.

 

Declaration:

 

a. NESTED TABLE

 

  a.1 Delcare and use in PL/SQL code:

 

TYPE NTab_List1 is TABLE OF TYPE INTEGER;

 

      Eg:

 CREATE OR REPLACE PROCEDURE PRC_NT

 IS

 

 TYPE NTab_List1 is TABLE OF TYPE INTEGER;                 --create a Collection type TYPE NTab_List1

 TAB NTab_List1;                                                                    --create a variable of NTab_List1 Type

 

 Begin

 

--<code here>

 

 End;

 

 a.2 Declare Outside PL/SQL:

 

CREATE TYPE NTab_List2 AS TABLE OF NUMBER;                -- in SQL Prompt

 

  And use inside PL/SQL:

 

  CREATE OR REPLACE PROCEDURE PRC_NT

  IS

  TAB NTab_List1;                                                                -- Just create a variable of NTab_List1 Type since

                                                                                                --NTab_List1 Collection type already exists

  Begin

 

  --<code here>

 

  End;

 

 

a.3 Declare and use outside PL/SQL code: (Used as Column Datatypes in Tables)

 

 

CREATE TYPE NTab_List2 AS TABLE OF VARCHAR2;

 

CREATE TABLE  NS_TEST

(

 KEY               NUMBER;

 NAME            VARCHAR2(50);

              ADDRESS     NTab_List

            )

             NESTED TABLE VAR3 STORE AS List_Tab;

 

I.  Inserting data into a Nested Table in a column

The address of a customer goes into the single column NTab_List. As I said earlier, here comes the advantage of an unbouded array. The Nested table in the
 column provides the flexibility of inserting varying number of address lines into the column. The column
ADDRESS could have any number of records in a single cell.

BEGIN
   INSERT INTO NS_TEST
      VALUES(1001,'Lynn Saunders',
        NTab_List ( 1027 ,
                 North Avenue ,
                 Regent Street ,
                 Nt Valley ,
                 Berligton 
                 74839 )
        );
END;

II. Retrieving data

Get address of customer with customer id=1001

DECLARE
   NTAB NTAB_LIST;
BEGIN
   SELECT NTAB_LIST INTO NTAB FROM NS_TEST
      WHERE ID = 1001;
END;

III. Updation

Suppose the customer with id=1001 needs to change his address. Then

DECLARE
   NEW_NTAB NTAB_LIST:=
     NTAB_LIST ( 892 ,
                 SOUTH CIRCLE ,
                 MALLEY STREET ,
                 89399 );
BEGIN
   UPDATE DEPT
      SET  NTAB_LIST = NEW_NTAB WHERE ID=1001;
END;
 

 

 

b. PL/SQL TABLE:

             

            The difference is PL/SQL table should always be indexed any of the below types.

 

BINARY_INTEGER, BOOLEAN, LONG, LONG RAW, NATURAL, NATURALN, PLS_INTEGER, POSITIVE, POSITIVEN, SIGNTYPE, and STRING.

 

Declaration:

 

TYPE tab is TABLE OF TYPE INTEGER INDEX BY BINARY_INTEGER

Also, we can use the %TYPE to make use of the dynamic datatype functionality.

For eg:

TYPE TAB_EMP IS TABLE OF EMP%TYPE INDEX BY BINARY_INTEGER;

Usage is similar to that of Nested Table.

Some other key differences between PL/SQL and Nested Tables:

To extend a Nested table, you need to use a built-in procedure EXTEND, but to extend a PL/SQL table, you just increment the subscripts.

The value of an uninitialized Nested table is NULL, but an uninitialized PL/SQL table is empty. So, you can compare nested tables using IS NULL operator.

PL/SQL tables are initially sparse. They can store reference data using a numeric primary key as the index.
PL/SQL supports implicit (automatic) datatype conversion between Arrays and PL/SQL tables.






insert, update, delete on a Global Temporary table, TRUNCATE a Global Temporary table

Read Next:

Oracle Global Temporary Tables : ON COMMIT DELETE ROWS, TRUNCATE etc



   
Also See: Forum Updates: