PL/SQL Index-by tables are a type of data structure available in Oracle database. They allow you to store and access data using a key or index, similar to how you would use an array. However, unlike arrays, index-by tables can be dynamically resized, making them more flexible and efficient.
To create an index-by table, you first need to create a TYPE:
TYPE my_table IS TABLE OF VARCHAR2(255) INDEX BY VARCHAR2(255);
Once you have created the TYPE, you can then create a variable of that type:
t my_table;
You can then insert data into the table using the key or index:
t('key1') := 'value1';
t('key2') := 'value2';
You can also update and delete data in the same way:
t('key1') := 'new_value1'; -- Update
delete t('key2'); -- Delete
To retrieve data from the table, you can use the key or index:
SELECT t('key1') FROM DUAL;
Oracle PL/SQL also provides a number of built-in functions for working with index-by tables. These include:
FIRST – returns the first key in the table
LAST- returns the last key in the table
NEXT – returns the next key after a given key
PRIOR – returns the key prior to a given key
EXISTS – returns TRUE if a given key exists in the table, FALSE otherwise
COUNT – returns the number of keys in the table
LIMIT – returns the maximum number of keys that can be stored in the table
PL/SQL Index-by tables are a powerful tool that can help you manage and manipulate data more effectively in Oracle database.
Example
Student table
| STUDENT_ID | FIRST_NAME | LAST_NAME | CITY |
|---|---|---|---|
| 1 | Daniel | SCOTT | New York |
| 2 | Anthony | SIMMONS | Chicago |
| 3 | Sophia | THOMPSON | Los Angeles |
| 4 | Emily | PETERSON | Phoenix |
| 5 | David | DAWSON | Seattle |
| 6 | Gabriel | LEWIS | Boston |
| 7 | Natalie | MARTIN | Baltimore |
| 8 | Ava | GONZALES | Pasadena |
| 9 | Elliot | PETERSON | Chicago |
Index-by tables(associative arrays)
DECLARE
TYPE type_student IS TABLE OF VARCHAR2(200) INDEX BY VARCHAR2(200);
adr_list type_student;
v_address VARCHAR2(200);
BEGIN
adr_list('Los Angeles') := 'address_1';
adr_list('Chicago') := 'address_2';
adr_list('Seattle') := 'address_3';
v_address := adr_list.FIRST;
WHILE v_address IS NOT null LOOP
FOR x in (SELECT * FROM students WHERE city=v_address)
LOOP
DBMS_OUTPUT.PUT_LINE (x.student_id||' - '||x.first_name||' '||x.last_name||' - '||x.city);
END LOOP;
v_address := adr_list.NEXT(v_address);
END LOOP;
END;
/
Output
| 2 – Anthony SIMMONS – Chicago |
| 9 – Elliot PETERSON – Chicago |
| 3 – Sophia THOMPSON – Los Angeles |
| 5 – David DAWSON – Seattle |