Oracle Consulting, Training,
Home Tutorials Case Studies Training Consulting Subscribe to ezine Contact Us About Us Legal Notices
For Better, Faster, Smarter,
and Development

Oracle PL/SQL Tutorial Part 9 - PL/SQL Collections

This series of tutorials has been created as a supplement to the Oracle PL/SQL Language Reference to help you see quickly how you can use the language features in your applications. We've covered data types, language elements, cursors, etc. in previous tutorials, Now let’s look at advanced data types - PL/SQL collections.

PL/SQL Collections

In part 3 of this Oracle PL/SQL we introduced the basic data types, however , in order to solve real-world problems, all languages need structured data types such as records, sets, arrays etc. Other than records, these structured data types are known as collections in PL/SQL and are available in 3 different forms: nested tables varrays associative arrays Let's look at the definition and use of each of these in more detail.

PLSQL Nested Tables

Nested tables are one-dimensional arrays which can be declared in the database as a column in another table and in PL/SQL as stand-alone tables, however they should not be confused with the PL/SQL index-by tables that were available in PL/SQL 8 - those are now known as associative arrays as we'll see later. Theoretically nested tables have no upper or lower limits and are therefore constrained only by the amount of memory available. When created, nested tables are densely populated - i.e. each row in the table has a value - but rows can be (logically) deleted so nested tables can become sparsely populated. Each row of the nested table must be of the same type. Declaring a nested table in PL/SQL is done in 2 stages - first declare a type and then declare a variable of that type as follows: TYPE <type_name> IS TABLE OF <existing_type> ; <variable_name> <type_name>; For example, suppose we want to create a table of numbers, the declarations would then be TYPE num_tab IS TABLE OF NUMBER ; my_tab num_tab;


VARRAYs are variable length, one dimensional, densely populated arrays (dense in the sense that each cell must exist, although it may be empty). Again each element must be of the same type and like nested tables they can be defined in the database or in PL/SQL. The declaration defines the size of the array which is fixed - you cannot add new cells to or delete cells from a VARRAY once you've declared it. These are designed for storing a small number of attributes. For example let's suppose we had a very primitive contact management system which stored names, 3 addresses (business,home and head office), 3 email addresses (business, home and alternative) and 3 phone numbers (business, home and mobile). In this case we know in advance the maximum number of each type of attribute we want to store so VARRAYs are ideal for this. If we didn't know how many would be stored (for example we wanted to keep a history of addresses, names and telephone numbers) then we would use nested tables. For the sake of this example we'll pretend that PL/SQL automatically stores everything in a database for us. Like nested tables we first declare a type and then declare a variable of that type as follows: TYPE <type_name> IS VARRAY <size> OF <existing_type> ; <variable_name> <type_name>; To create the data structures required for our example, the declarations would be:- TYPE phone_no_tab IS VARRAY(3) OF NUMBER ; TYPE address_tab IS VARRAY(3) OF VARCHAR2(500); TYPE email_addr_tab IS VARRAY(3) OF VARCHAR2(100); TYPE name_tab IS TABLE OF VARCHAR2(100); addresses    address_tab; phone_nos    phone_no_tab; names        name_tab; email_addresses email_addr_tab; Note that at the moment, each of the types of data is stored separately and therefore has to be worked with separately. To put this all together we need to create another type as a record then create a nested table to hold the records as follows:- TYPE contact_rec IS RECORD (     name  VARCHAR2(100);     addrs  address_tab_type;     phone_nums  phone_no_tab_type;     email_addrs email_addr_tab_type; ); TYPE contacts_tab IS TABLE OF contact_rec; contacts contacts_tab;

PL/SQL Associative Arrays

The final collection type is an associative array - previously known as a PL/SQL tables or an index-by table. They are known as associative arrays because they are "associated with"  (i.e. indexed by) PLSQL integers or character strings (VARCHAR2, VARCHAR, STRING or LONG data types). Like nested tables, associative arrays are unbounded, single dimensional and each cell must be of the same type. However, unlike nested tables, associative arrays are sparse - a cell does not have to exist. To make this clearer let's have a look at the syntax and an example. As with nested tables we first declare a type and then declare a variable of that type as follows: TYPE <type_name> IS TABLE OF <existing_type> ; <variable_name> <type_name>; For example, suppose we want to create a table of numbers, the declarations would then be TYPE number_tab IS TABLE OF NUMBER INDEX BY PLS_INTEGER; my_tab number_tab; The next tutorial looks more deeply into using these collection data types. As good as these tutorials are, they can only take you so far with learning PL/SQL, so if you want to become proficient quickly the best way is to take one of our classroom-based Oracle training courses. PL/SQL tutorial Part 8                                                                     PL/SQL tutorial Part 10  --------------------------------------- Looking to sky-rocket productivity, save time and reduce costs? Training is a highly cost-effective and proven method of boosting productivity. Smartsoft offers instructor- led training in Oracle and related technologies on or off site in cities across the UK as well as self-study online training. See our scheduled Oracle training courses, or let us know your requirements. Looking for more Oracle tips and tricks? For no frills, no fluff, just solid, reliable technical information, take a short cut now and subscribe to our newsletter. Jam-packed full of tips and tricks, it will help you make your Oracle systems faster and more reliable and save you hours searching for information. Subscribe today - there's no charge - and your first issue will soon be winging its way to your mailbox. Smartsoft Computing Ltd, Bristol, England Tel: 0845 003 1320 Need help with Oracle? Contact Us View our privacy policy This site uses to gather statistical information about our visitors. This data is aggregated to show industry trends (such as browser share). However, this data shall be the average of many thousands of visits and is in no way linked to individuals. View woopra privacy policy.  Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners. © Copyright Smartsoft Computing Ltd 2014. All rights reserved.
Bookmark and Share