In PL/SQL, both %TYPE and %ROWTYPE are attributes that allow you to define variables that inherit the data type of a column or the structure of a table (or cursor). The key difference between them is the scope and purpose of their usage.
1. %TYPE
The %TYPE attribute
is used to declare a variable that inherits the data type of a specific column, field, or variable.
- It is useful when you want to ensure that the variable you declare has the same data type as a particular column or another variable, making your code more maintainable and less prone to errors if the column's data type changes.
Example of %TYPE:
DECLARE
-- Declare a variable with the same data type as employees.employee_id
v_emp_id employees.employee_id%TYPE;
-- Declare a variable with the same data type as employees.first_name
v_emp_name employees.first_name%TYPE;
BEGIN
-- Assign values to the variables
v_emp_id := 101;
v_emp_name := 'John';
-- Output the values
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_emp_id);
DBMS_OUTPUT.PUT_LINE('Employee Name: ' || v_emp_name);
END;
/
In this example:
-
v_emp_id
will inherit the data type of the employee_id column in the employees table. -
v_emp_name
will inherit the data type of the first_name column in the employees table.
2. %ROWTYPE
The %ROWTYPE attribute
is used to declare a record that can hold an entire row of data from a table or a cursor.
- It inherits the structure (i.e., all the columns and their corresponding data types) of the table or cursor.
- It is useful when you want to work with an entire row of data and avoid declaring each column separately.
Example of %ROWTYPE:
DECLARE
-- Declare a variable that can hold an entire row from the employees table
v_employee employees%ROWTYPE;
BEGIN
-- Select an employee's row into the record variable
SELECT *
INTO v_employee
FROM employees
WHERE employee_id = 101;
-- Output the values of the record
DBMS_OUTPUT.PUT_LINE('Employee ID: ' || v_employee.employee_id);
DBMS_OUTPUT.PUT_LINE('First Name: ' || v_employee.first_name);
DBMS_OUTPUT.PUT_LINE('Last Name: ' || v_employee.last_name);
END;
/
In this example, v_employee is a variable that can hold all the columns of a row from the employees table.
Summary:
Use %TYPE when you need to declare a variable with the same data type as a specific column or another variable.
Use %ROWTYPE when you need to work with an entire row of a table or cursor, without needing to declare each column individually.