Call now: 252-767-6166  
Oracle Training Oracle Support Development Oracle Apps

 E-mail Us
 Oracle Articles
New Oracle Articles

 Oracle Training
 Oracle Tips

 Oracle Forum
 Class Catalog

 Remote DBA
 Oracle Tuning
 Emergency 911
 RAC Support
 Apps Support
 Oracle Support

 SQL Tuning

 Oracle UNIX
 Oracle Linux
 Remote s
 Remote plans
 Application Server

 Oracle Forms
 Oracle Portal
 App Upgrades
 SQL Server
 Oracle Concepts
 Software Support

 Remote S


 Consulting Staff
 Consulting Prices
 Help Wanted!


 Oracle Posters
 Oracle Books

 Oracle Scripts

Don Burleson Blog 







Oracle VARRAY Examples

Oracle Tips by Burleson Consulting
Don Burleson

Create of a VARRAY Type

Another special type is the VARRAY or varying array type. This type should be used when the number of instances to be stored is small. This type is stored inline with the other table data. In early releases (up to 8.0.3) the varray could take up to 25 times the amount of storage as a nested table for the same values. Unless you are on a newer release where this has been corrected I suggest use of the nested table instead of a VARRAY. However, let's examine how they are created anyway.

rem There is a fixed number of FTX codes and it is small
rem so use a VARRAY
   ftx_code          CHAR(8) ,
   ftx_code_desc     VARCHAR2(32),
primary_ftx_code_ind CHAR(1)
rem ftx_v is a VARRAY of 6 elements

Notice that the number of instances of the VARRAY is set at six(6) in this example. This required 676 bytes of RAW inline storage. You have no control over storage and can not index or constrain varray values.

Populating VARRAY Types

As was stated in other sections the creation of a type automatically creates a method (constructor) to populate the type. To call the method the original type name is used. The constructor is never called implicitly but must be called explicitly. The constructor can be used anywhere a function call is used. Here is an example insert into the employee_info table.

insert into
values(1,name_t('Michael','Burleson','R'), <--- Note name_t constructor
dependent_list( <--- Note use of dependent_list constructor
6* );

1 row created

Notice that the format for using the constructor methods walks down the type tree. In this case the type tree for the dependent type looks like so:

dependents <---- Attribute in table
dependent_list <----- Nested Table Type
dependent_t <----- Base Type

?Dependents? is the attribute so it isn't used in the type tree. Therefore, we start at the dependent_list type as the outermost method and end at dependent_t the basic type constructor method. Since the type is for a nested table, we specify the dependent_t method multiple times for each insert into the nested table. Notice that we also use a constructor method, name_t, inside the innermost type constructor to perform the insert into the dependents name attribute which is itself a type.

Population of a varray type is identical to population of a nested table type with the exception that you can only insert up to the maximum specified count of the varray.

Use of Other Built-in Methods for Collections

In addition to the constructor type Oracle also provides collection methods for use with VARRAYS and nested tables. These methods cannot be used outside of PL/SQL. Collection methods cannot be used in DML but only in procedural statements.

  • EXISTS -- Used to determine if a specific element in a collection exists. EXISTS is used with nested tables.
  • COUNT -- Returns the number of elements that a collection currently contains not including null values. For varrays count is equal to LAST. For nested tables COUNT and LAST may be different due to deleted values in interstitial data sites in the nested table.
  • LIMIT -- Used for VARRAYS to determine the maximum number of values allowed. If LIMIT is used on a nested table it will return a null.
  • FIRST and LAST -- Return the smallest and largest index numbers for the collection referenced. Naturally, they return null if the collection is empty. For
    VARRAYS FIRST always returns 1, for nested tables FIRST returns the value of the first filled spot for that entry. LAST returns the last filled instance of a VARRAY and a nested table. For a VARRAY COUNT will always equal LAST. For a nested table they can be different but LAST should always be greater than COUNT if they are different for a nested table.
  • PRIOR and NEXT -- Return the prior or next value based on the input value for the collection index. PRIOR and NEXT ignore deleted instances in a collection.
  • EXTEND -- Appends instances to a collection. EXTEND has three forms, EXTEND, which adds one null instance, EXTEND(n) which adds "n" null instances and EXTEND(n,m) which appends N copies of instance "m" to the collection. For not null specified collections forms one and two cannot be used.
  • TRIM -- Trim removes instances from a collection. TRIM used with no arguments removes the last instance, TRIM(n) removes "n" instances from the collection.
  • DELETE -- DELETE removes specified items from a nested table or all of a
    VARRAY. DELETE specified with no arguments removes all instances of a collection. For nested tables only DELETE(n) removes the nth instance and DELETE(n,m) deletes the nth through the mth instances of the nested table that relate to the specified master record.

Remember when using these methods that a VARRAY is a dense type, that its values start at one and go to the last filled value as far as the index is concerned with no breaks and no null values allowed. A nested table is allowed to have deleted values (i.e. it can be "sparse"). Therefore if you attempt to use a method that is inappropriate such as DELETE with an argument against a VARRAY you will receive an error.

Collection methods can raise the following exceptions:

  • COLLECTION_IS_NULL -- Caused when the collection referenced is atomically null.
  • NO_DATA_FOUND -- Subscript points to a null instance of the collection.
  • SUBSCRIPT_BEYOND_COUNT -- The specified subscript is beyond the number of instances in the collection.
  • SUBSCRIPT_OUTSIDE_LIMIT -- The specified subscript is outside the legal range (usually received from VARRAY references)
  • VALUE_ERROR -- Subscript is null or is not an integer.

These collection methods can be used in a variety of ways. In the case of a nested table where some of the values are null, selection using a standard cursor could result in an exception. Use the FIRST and NEXT collection methods to transverse these null values.

j := dependents.FIRST;
? process dependents(j)?
j := dependents.NEXT(j);

So what does this code fragment do? First, we use the FIRST collection method to get the index integer of the first valid record for the dependents nested table. Remember that a nested table is a sparse construct so the first valid value may not be one. Next, we begin loop processing of values assuming we didn't get a null value on our call to FIRST.

Once we have processed the first value we reset out counter to the appropriate NEXT value. Once NEXT evaluates to NULL we exit the loop.

Get the Complete
Oracle SQL Tuning Information 

The landmark book "Advanced Oracle SQL Tuning  The Definitive Reference"  is filled with valuable information on Oracle SQL Tuning. This book includes scripts and tools to hypercharge Oracle 11g performance and you can buy it for 30% off directly from the publisher.



Oracle Training at Sea
oracle dba poster

Follow us on Twitter 
Oracle performance tuning software 
Oracle Linux poster


Burleson is the American Team

Note: This Oracle documentation was created as a support and Oracle training reference for use by our DBA performance tuning consulting professionals.  Feel free to ask questions on our Oracle forum.

Verify experience! Anyone considering using the services of an Oracle support expert should independently investigate their credentials and experience, and not rely on advertisements and self-proclaimed expertise. All legitimate Oracle experts publish their Oracle qualifications.

Errata?  Oracle technology is changing and we strive to update our BC Oracle support information.  If you find an error or have a suggestion for improving our content, we would appreciate your feedback.  Just  e-mail:  

and include the URL for the page.


Burleson Consulting

The Oracle of Database Support

Oracle Performance Tuning

Remote DBA Services


Copyright © 1996 -  2020

All rights reserved by Burleson

Oracle ® is the registered trademark of Oracle Corporation.