PL/SQL Collections and Records

PL/SQL Collections and Records

Collections and recordings are compound data types containing internal elements like array, record or table.

Collections

Collections are data types that allow simultaneous processing of multiple variables of the same type. Each element has a unique index, which determines its position in the collection.

Types of collections: Nested Tables, Varrays, Associative Arrays (Index-By Tables)

Nested Tables:

DECLARE
	TYPE test IS TABLE OF VARCHAR2(50);
	t1 test ;
	t2 test := test() ;
BEGIN
	IF t1 IS NULL THEN
		DBMS_OUTPUT.PUT_LINE('t1 is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('t1 is NOT NULL');
	END IF;
	IF t2 IS NULL THEN
		DBMS_OUTPUT.PUT_LINE('t2 is NULL');
	ELSE
		DBMS_OUTPUT.PUT_LINE('t2 is NOT NULL');
	END IF;
END;

Varrays:

DECLARE
	TYPE t_code IS VARRAY(5) OF NUMBER(3);
	test t_code := t_code(100,101);
BEGIN
	FOR i IN test.FIRST..test.LAST LOOP
		DELETE FROM customers WHERE customer_id = test (i);
	END LOOP;
END;

Associative Arrays:

DECLARE
	TYPE type_table IS TABLE OF NUMBER;
	t_table type_table:= type_table();
BEGIN
FOR i IN 1..5 LOOP
	t_table.EXTEND;
	t_table(i) := i;
END LOOP;
DBMS_OUTPUT.PUT_LINE('The table has ' || t_table.COUNT|| ' rows');
FOR i IN t_table.FIRST..t_table.LAST LOOP
	DBMS_OUTPUT.PUT_LINE('Row ' || i||' have value '|| t_table (i));
END LOOP;
FOR i IN t_table.FIRST..t_table.LAST LOOP
	t_table (i) := NULL;
END LOOP;
END;

Records

A PL/SQL record is a variable that can contain values separated, each individually addressable.
A record consists of fields, and have names that can be referenced in assignments and expressions. Fields can have a recording data types and sizes.

Example:

DECLARE
	TYPE cust_type IS RECORD
	(customer_id customers.customer_id%TYPE,
	customer_name customers.customer_name%TYPE,
	product_id customers.product_id%TYPE);
	rec cust_type;
BEGIN
	rec.customer_id:=500;
	rec.customer_name:='COMPANY';
	rec.product_id:='121';
	DBMS_OUTPUT.PUT_LINE(rec.customer_id||' '|| rec.customer_name ||' '|| rec.product_id);
END;

%ROWTYPE attribute is used to declare a record based on a collection of columns in database table.
Fields with registration they will get their name and type of data from the table or view columns referenced in the declaration of registration.

DECLARE
	CURSOR c1 IS 
	SELECT product_id, product_name, price 
	FROM products;
	rec1 c1%ROWTYPE;
	TYPE ProRec2 IS RECORD (
		pro_id    products.product_id%TYPE, 
		pro_name  products.product_name%TYPE, 
		pro_price products.price%TYPE
		);
	rec2 ProRec2;
	TYPE ProRec3 IS RECORD (
		pro_id    NUMBER, 
		pro_name  VARCHAR2(14), 
		pro_price VARCHAR2(13)
		);
	rec3 ProRec3;
BEGIN
   NULL;
END;