Table of Contents
How to store string array in Oracle DB?
There are 2 types of array which are persistent in type. So they can be stored in Oracle DB.
- Nested Table
- Varray
Nested Table in SQL:
Creating Nested Table Object:
--How to store string array in Oracle DB? : Example CREATE OR REPLACE TYPE ADDR_TYPE AS OBJECT (STATE VARCHAR2(100), CITY VARCHAR2(100) ); /
CREATE OR REPLACE TYPE ADDR_TAB AS TABLE OF ADDR_TYPE; /
Verifying Nested Table Object Data Dictionary:
--How to store string array in Oracle DB? : View data
SELECT TYPE_NAME, TYPE_OID, TYPECODE, ATTRIBUTES, PREDEFINED, INCOMPLETE, FINAL, INSTANTIABLE
FROM USER_TYPES
WHERE TYPE_NAME IN ('ADDR_TYPE', 'ADDR_TAB');

Creating Nested Tables:
--How to store string array in Oracle DB? : Example CREATE TABLE CUSTOMER_ADD_INFO (CUSTID NUMBER(6), CUST_NAME VARCHAR2(100), CUST_ADDRESS ADDR_TAB ) NESTED TABLE CUST_ADDRESS STORE AS CUST_ADD;
Verifying Nested Table Data Dictionary:
SELECT * FROM USER_NESTED_TABLES WHERE TABLE_NAME = 'CUST_ADD';

Inserting Data into Nested Tables:
INSERT INTO CUSTOMER_ADD_INFO
VALUES(100001, 'Steven Smith', ADDR_TAB(ADDR_TYPE('New York','New York')));
INSERT INTO CUSTOMER_ADD_INFO
VALUES(100002, 'Jhon Smith', ADDR_TAB(ADDR_TYPE('California','California')));
SELECT * FROM CUSTOMER_ADD_INFO;

Above data from CUST_ADDRESS column are not user readable format. To convert it user readable format user below query:
--How to store string array in Oracle DB? : View data
SELECT A.CUSTID,
A.CUST_NAME,
B.STATE,
B.CITY
FROM CUSTOMER_ADD_INFO A,
TABLE(A.CUST_ADDRESS) B;

Update a specific record in Nested table column:
--How to store string array in Oracle DB? : Update data
UPDATE TABLE(SELECT CUST_ADDRESS
FROM CUSTOMER_ADD_INFO
WHERE CUSTID = 100001
) T
SET T.STATE = 'New York State',
T.CITY = 'New York City';
SELECT A.CUSTID, A.CUST_NAME, B.STATE, B.CITY FROM CUSTOMER_ADD_INFO A, TABLE(A.CUST_ADDRESS) B;

Further Update, Insert and verify data from Nested Tables:
INSERT INTO CUSTOMER_ADD_INFO VALUES(100001, 'Steven Smith', ADDR_TAB(ADDR_TYPE('Boston','Boston')));
SELECT A.CUSTID,
A.CUST_NAME,
B.STATE,
B.CITY
FROM CUSTOMER_ADD_INFO A,
TABLE(A.CUST_ADDRESS) B;

SELECT A.CUSTID, A.CUST_NAME, B.STATE, B.CITY FROM CUSTOMER_ADD_INFO A, TABLE(A.CUST_ADDRESS) B WHERE A.CUSTID = 100001 ORDER BY CUSTID;

Delete a specific record from Nested Table:
--How to store string array in Oracle DB? : Delete data DELETE TABLE(SELECT T.CUST_ADDRESS FROM CUSTOMER_ADD_INFO T, TABLE(T.CUST_ADDRESS) D WHERE T.CUSTID = 100001 AND D.STATE = 'Boston');
SELECT A.CUSTID, A.CUST_NAME, B.STATE, B.CITY FROM CUSTOMER_ADD_INFO A, TABLE(A.CUST_ADDRESS) B WHERE A.CUSTID = 100001 ORDER BY CUSTID;

Varray in SQL:
CREATE OR REPLACE TYPE ADDR_TAB_VA IS VARRAY(10) OF ADDR_TYPE; /
Verifying Varrays from Data Dictionary:
SELECT TYPE_NAME, TYPE_OID, TYPECODE, ATTRIBUTES, PREDEFINED, INCOMPLETE, FINAL, INSTANTIABLE FROM USER_TYPES WHERE TYPE_NAME = 'ADDR_TAB_VA';

Creating Table with Varray column:
--How to store string array in Oracle DB? : Example CREATE TABLE CUSTOMER_ADD_INFO_VA (CUSTID NUMBER(6), CUST_NAME VARCHAR2(100), CUST_ADDRESS ADDR_TAB_VA );
Inserting data into table with Varray column:
INSERT INTO CUSTOMER_ADD_INFO_VA
VALUES(100001, 'Steven Smith', ADDR_TAB_VA(ADDR_TYPE('New York','New York')));
INSERT INTO CUSTOMER_ADD_INFO_VA
VALUES(100002, 'Jhon Smith', ADDR_TAB_VA(ADDR_TYPE('California','California')));
Selecting data from table with Varray column:
SELECT * FROM CUSTOMER_ADD_INFO_VA;

Above CUST_ADDRESS column is not in readable format. To convert it in user readable format use the below query:
--How to store string array in Oracle DB? : View data
SELECT A.CUSTID,
A.CUST_NAME,
B.STATE,
B.CITY
FROM CUSTOMER_ADD_INFO_VA A,
TABLE(A.CUST_ADDRESS) B
ORDER BY CUSTID;

Update a specific record in Varray column:
UPDATE CUSTOMER_ADD_INFO_VA
SET CUST_ADDRESS = ADDR_TAB_VA(ADDR_TYPE('New York State', 'New York City'))
WHERE CUSTID = 100001;
SELECT A.CUSTID,
A.CUST_NAME,
B.STATE,
B.CITY
FROM CUSTOMER_ADD_INFO_VA A,
TABLE(A.CUST_ADDRESS) B
ORDER BY CUSTID;

Further Insert and Query data from table with Varray:
INSERT INTO CUSTOMER_ADD_INFO_VA
VALUES(100001, 'Steven Smith', ADDR_TAB_VA(ADDR_TYPE('Boston','Boston')));
SELECT A.CUSTID,
A.CUST_NAME,
B.STATE,
B.CITY
FROM CUSTOMER_ADD_INFO_VA A,
TABLE(A.CUST_ADDRESS) B
ORDER BY CUSTID;

Can not perform Delete operation on a Varray:
DELETE TABLE(SELECT T.CUST_ADDRESS
FROM CUSTOMER_ADD_INFO_VA T,
TABLE(T.CUST_ADDRESS) D
WHERE T.CUSTID = 100001
AND D.STATE = 'Boston'
);

RELATED TOPICS: