Create Schema-Level Type
CREATE OR REPLACE TYPE list_of_names_t IS
VARRAY(10) OF VARCHAR2 (100);
Type created.
Let Others Use Your Type
GRANT EXECUTE ON list_of_names_t TO PUBLIC
ORA-04088: error during execution of trigger 'SYS.DBCLOUD_BEFORE_DDL_DB_TRG' ORA-06512: at "SYS.DBCLOUD_SYS_SEC", line 1802 ORA-06512: at "SYS.DBCLOUD_SYS_SEC", line 2127 ORA-06512: at line 2More Details: https://docs.oracle.com/error-help/db/ora-04088
All The Usual Methods
DECLARE
happyfamily list_of_names_t := list_of_names_t ();
BEGIN
happyfamily.EXTEND (4);
happyfamily (1) := 'Eli';
happyfamily (2) := 'Steven';
happyfamily (3) := 'Chris';
happyfamily (4) := 'Veva';
FOR l_row IN 1 .. happyfamily.COUNT
LOOP
DBMS_OUTPUT.put_line (happyfamily (l_row));
END LOOP;
END;
Eli
Steven
Chris
Veva
Limitations on DELETE with Varray
DECLARE
happyfamily list_of_names_t := list_of_names_t ();
BEGIN
happyfamily.EXTEND (4);
happyfamily (1) := 'Eli';
happyfamily (2) := 'Steven';
happyfamily (3) := 'Chris';
happyfamily (4) := 'Veva';
happyfamily.delete (2);
END;
ORA-06550: line 10, column 4: PLS-00306: wrong number or types of arguments in call to 'DELETE'More Details: https://docs.oracle.com/error-help/db/ora-06550
Use TABLE Operator with Varray
DECLARE
happyfamily list_of_names_t := list_of_names_t ();
BEGIN
happyfamily.EXTEND (4);
happyfamily (1) := 'Eli';
happyfamily (2) := 'Steven';
happyfamily (3) := 'Chris';
happyfamily (4) := 'Veva';
/* Use TABLE operator to apply SQL operations to
a PL/SQL nested table */
FOR rec IN ( SELECT COLUMN_VALUE family_name
FROM TABLE (happyfamily)
ORDER BY family_name)
LOOP
DBMS_OUTPUT.put_line (rec.family_name);
END LOOP;
END;
Chris
Eli
Steven
Veva
Varray as Column Type in Database
CREATE OR REPLACE TYPE parent_names_t IS VARRAY (2) OF VARCHAR2 (100);
Type created.
Silly Varray!
CREATE OR REPLACE TYPE child_names_t IS VARRAY (1) OF VARCHAR2 (100);
Type created.
CREATE TABLE family
(
surname VARCHAR2 (1000)
, parent_names parent_names_t
, children_names child_names_t
)
Table created.
Insert Varrays into Table
DECLARE
parents parent_names_t := parent_names_t ();
children child_names_t := child_names_t ();
BEGIN
DBMS_OUTPUT.put_line (parents.LIMIT);
parents.EXTEND (2);
parents (1) := 'Samuel';
parents (2) := 'Charina';
--
children.EXTEND;
children (1) := 'Feather';
--
INSERT INTO family (surname, parent_names, children_names)
VALUES ('Assurty', parents, children);
COMMIT;
END;
2
SELECT * FROM family
SURNAME | PARENT_NAMES | CHILDREN_NAMES |
---|---|---|
Assurty | [unsupported data type] | [unsupported data type] |
Modify Limit on Existing Varray
CREATE OR REPLACE TYPE names_vat AS VARRAY (10) OF VARCHAR2 (80);
Type created.
DECLARE
l_list names_vat := names_vat ();
BEGIN
DBMS_OUTPUT.put_line ('Limit of names_vat = ' || l_list.LIMIT);
END;
Limit of names_vat = 10
Modify Limit on Existing Varray
ALTER TYPE names_vat MODIFY LIMIT 100 INVALIDATE
Type altered.
DECLARE
l_list names_vat := names_vat ();
BEGIN
DBMS_OUTPUT.put_line ('Limit of names_vat = ' || l_list.LIMIT);
END;
Limit of names_vat = 100
Modify Limit on Existing Varray with Dynamic SQL
BEGIN
EXECUTE IMMEDIATE 'ALTER TYPE names_vat MODIFY LIMIT 200 INVALIDATE';
END;
Statement processed.
DECLARE
l_list names_vat := names_vat ();
BEGIN
DBMS_OUTPUT.put_line ('Limit of names_vat = ' || l_list.LIMIT);
END;
Limit of names_vat = 200