Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programming PL SQL.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
5.06 Mб
Скачать

11.8.2 Collections and the Data Dictionary

Thereare a few new entries in the data dictionary that will be very helpful in managing your nested table and VARRAY collection types (see Table 11-2). The shorthand dictionary term for user-defined types is simply TYPE. Collection type definitions are found in the USER_SOURCE view (or DBA_SOURCE, or ALL_SOURCE).

Table 11-2. Data dictionary entries for collection types

To answer the question...

Use this view

As in

What collection types have I created?

USER_TYPES

SELECT type_name

FROM user_types

WHERE typecode = 'COLLECTION';

What was the original type definition of collection Foo_t?

USER_SOURCE

SELECT text

FROM user_source

WHERE name = 'FOO_T'

AND type = 'TYPE'

ORDER BY line;

What columns implement Foo_t?

USER_TAB_ COLUMNS

SELECT table_name, column_name

FROM user_tab_columns

WHERE data_type = 'FOO_T';

What database objects are dependent on Foo_t?

USER_DEPENDENCIES

SELECT name, type

FROM user_dependencies

WHERE referenced_name = 'FOO_T';

11.9 Choosing a Collection Type

Which collection type makes sense for your application? In some cases, the choice is obvious. In others, there may be several acceptable choices. This section provides some guidance. Table 11-3 illustrates many of the differences betweenassociative arrays, nested tables, and VARRAYs.

As a PL/SQL developer, I find myself leaning toward using associative arrays as a first instinct. Why is this? They involve the least amount of coding. You don't have to initialize or extend them. They have historically been the most efficient collection type (although this distinction will probably fade over time). However, if you want to store your collection within a database table, you cannot use an associative array. The question then becomes: nested table or VARRAY?

Beyond these very high-level determinants, review the following guidelines for additional assistance in making your choice:

  • If you intend to store large amounts of persistent data in a column collection, your only option is a nested table. Oracle will then use a separate table behind the scenes to hold the collection data, so you can allow for almost limitless growth.

  • If you want to preserve the order of elements stored in the collection column and if your dataset will be small, use a VARRAY. What is "small"? I tend to think in terms of how much data you can fit into a single database block; if you span blocks, you get row chaining, which decreases performance. The database block size is established at database creation time and is typically 2K, 4K, or 8K.

  • Here are some other indications that a VARRAY would be appropriate: you don't want to worry about deletions occurring in the middle of the data set; your data has an intrinsic upper bound; or you expect, in general, to retrieve the entire collection simultaneously.

  • If you need sparse associative arrays (for example, for "data-smart" storage), your only practical option is an associative array. True, you could allocate and then delete elements of a nested table variable (as illustrated in the later section on NEXT and PRIOR methods), but it is inefficient to do so for anything but the smallest collections.

  • If your PL/SQL program needs to run under both Oracle7 and Oracle8, associative arrays are again your only option. And if your PL/SQL application requires negative subscripts, you also have to use associative arrays.

Table 11-3. Comparing Oracle collection types

Characteristic

Associative array

Nested table

VARRAY

Dimensionality

Single

Single

Single

Usable in SQL?

No

Yes

Yes

Usable as column datatype in a table?

No

Yes; data stored "out of line" (in separate table)

Yes; data stored "in line" (in same table)

Uninitialized state

Empty (cannot be null); elements undefined

Atomically null; illegal to reference elements

Atomically null; illegal to reference elements

Initialization

Automatic, when declared

Via constructor, fetch, assignment

Via constructor, fetch, assignment

In PL/SQL, elements referenced via

BINARY_INTEGER(-2,147,483,647 .. 2,147,483,647)

VARCHAR2 (Oracle9i Release 2 and above)

Positive integer between 1 and 2,147,483,647

Positive integer between 1 and 2,147,483,647

Sparse?

Yes

Initially, no; after deletions, yes

No

Bounded?

No

Can be extended

Yes

Can assign value to any element at any time?

Yes

No; may need to EXTEND first

No; may need to EXTEND first, and cannot EXTEND past upper bound

Means of extending

Assign value to element with a new subscript

Use built-in EXTEND procedure (or TRIM to condense), with no predefined maximum

EXTEND (or TRIM), but only up to declared maximum size

Can be compared for equality?

No

No

No

Retains ordering and subscripts when stored in and retrieved from database?

N/A

No

Yes

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]