Assigning Values to Record Variables
A record variable means either a record variable or a record component of a composite variable.
To any record variable, you can assign a value to each field individually.
You can assign values using qualified expressions.
In some cases, you can assign the value of one record variable to another record variable.
If a record variable represents a full or partial row of a database table or view, you can assign the represented row to the record variable.
Topics
Assigning Values to RECORD Type Variables Using Qualified Expressions
You can assign values to RECORD
type variables using qualified expressions positional association or named association aggregates.
A qualified expression combines expression elements to create values of a RECORD
type. An aggregate defines a compound type value. You can assign values to a RECORD
type using qualified expressions. Positional and named associations are allowed for qualified expressions of RECORD
type. A positional association may not follow a named association in the same construct (and vice versa). A final optional others choice can be specified after the positional and named associations.
A qualified expression is this context has this structure:
qualified_expression ::= typemark ( aggregate ) aggregate ::= ( positional_association | named_association ) [ others_choice ] positional_association ::= ( expr )+ named_association ::= identifier => expr [,]+
Example 6-52 Assigning Values to RECORD Type Variables Using Qualified Expressions
This example shows the declaration, initialization, and definition of RECORD
type variables.
Type rec_t is defined and partially initialized in package pkg.
Variable v_rec1 is declared with that type and assigned initial values using a positional aggregate.
Variable v_rec2 is declared with that type as well and assigned initial values using a named association aggregate.
Variable v_rec3 is assigned the NULL values.
The procedure print_rec displays the values of the local variable v_rec1, followed by the procedure parameter pi_rec variable values. If no parameter is passed to the procedure, it displays the initial values set in the procedure definition.
Live SQL:
You can view and run this example on Oracle Live SQL at "18c Assigning Values to RECORD Type Variables Using Qualified Expressions"
CREATE PACKAGE pkg IS
TYPE rec_t IS RECORD
(year PLS_INTEGER := 2,
name VARCHAR2 (100) );
END;
/
DECLARE
v_rec1 pkg.rec_t := pkg.rec_t(1847,'ONE EIGHT FOUR SEVEN');
v_rec2 pkg.rec_t := pkg.rec_t(year => 1, name => 'ONE');
v_rec3 pkg.rec_t := pkg.rec_t(NULL,NULL);
PROCEDURE print_rec ( pi_rec pkg.rec_t := pkg.rec_t(1847+1, 'a'||'b')) IS
v_rec1 pkg.rec_t := pkg.rec_t(2847,'TWO EIGHT FOUR SEVEN');
BEGIN
DBMS_OUTPUT.PUT_LINE(NVL(v_rec1.year,0) ||' ' ||NVL(v_rec1.name,'N/A'));
DBMS_OUTPUT.PUT_LINE(NVL(pi_rec.year,0) ||' ' ||NVL(pi_rec.name,'N/A'));
END;
BEGIN
print_rec(v_rec1);
print_rec(v_rec2);
print_rec(v_rec3);
print_rec();
END;
/
2847 TWO EIGHT FOUR SEVEN 1847 ONE EIGHT FOUR SEVEN 2847 TWO EIGHT FOUR SEVEN 1 ONE 2847 TWO EIGHT FOUR SEVEN 0 N/A 2847 TWO EIGHT FOUR SEVEN 1848 ab
Assigning One Record Variable to Another
You can assign the value of one record variable to another record variable only in these cases:
-
The two variables have the same
RECORD
type. -
The target variable is declared with a
RECORD
type, the source variable is declared with%ROWTYPE
, their fields match in number and order, and corresponding fields have the same data type.
For record components of composite variables, the types of the composite variables need not match.
Example 6-53 Assigning Record to Another Record of Same RECORD Type
In this example, name1 and name2 have the same RECORD type, so you can assign the value of name1 to name2.
DECLARE TYPE name_rec IS RECORD ( first employees.first_name%TYPE DEFAULT 'John', last employees.last_name%TYPE DEFAULT 'Doe' ); name1 name_rec; name2 name_rec; BEGIN name1.first := 'Jane'; name1.last := 'Smith'; DBMS_OUTPUT.PUT_LINE('name1: ' || name1.first || ' ' || name1.last); name2 := name1; DBMS_OUTPUT.PUT_LINE('name2: ' || name2.first || ' ' || name2.last); END; /
Result:
name1: Jane Smith name2: Jane Smith
Example 6-54 Assigning %ROWTYPE Record to RECORD Type Record
In this example, the target variable is declared with a RECORD
type, the source variable is declared with %ROWTYPE
, their fields match in number and order, and corresponding fields have the same data type.
DECLARE TYPE name_rec IS RECORD ( first employees.first_name%TYPE DEFAULT 'John', last employees.last_name%TYPE DEFAULT 'Doe' ); CURSOR c IS SELECT first_name, last_name FROM employees; target name_rec; source c%ROWTYPE; BEGIN source.first_name := 'Jane'; source.last_name := 'Smith'; DBMS_OUTPUT.PUT_LINE ( 'source: ' || source.first_name || ' ' || source.last_name ); target := source; DBMS_OUTPUT.PUT_LINE ( 'target: ' || target.first || ' ' || target.last ); END; /
Result:
source: Jane Smith target: Jane Smith
Example 6-55 Assigning Nested Record to Another Record of Same RECORD Type
This example assigns the value of one nested record to another nested record. The nested records have the same RECORD
type, but the records in which they are nested do not.
DECLARE TYPE name_rec IS RECORD ( first employees.first_name%TYPE, last employees.last_name%TYPE ); TYPE phone_rec IS RECORD ( name name_rec, -- nested record phone employees.phone_number%TYPE ); TYPE email_rec IS RECORD ( name name_rec, -- nested record email employees.email%TYPE ); phone_contact phone_rec; email_contact email_rec; BEGIN phone_contact.name.first := 'John'; phone_contact.name.last := 'Smith'; phone_contact.phone := '1-650-555-1234'; email_contact.name := phone_contact.name; email_contact.email := ( email_contact.name.first || '.' || email_contact.name.last || '@' || 'example.com' ); DBMS_OUTPUT.PUT_LINE (email_contact.email); END; /
Result:
John.Smith@example.com
Assigning Full or Partial Rows to Record Variables
If a record variable represents a full or partial row of a database table or view, you can assign the represented row to the record variable.
Topics
Using SELECT INTO to Assign a Row to a Record Variable
The syntax of a simple SELECT
INTO
statement is:
SELECT select_list INTO record_variable_name FROM table_or_view_name;
For each column in select_list
, the record variable must have a corresponding, type-compatible field. The columns in select_list
must appear in the same order as the record fields.
See Also:
"SELECT INTO Statement" for complete syntax
Example 6-56 SELECT INTO Assigns Values to Record Variable
In this example, the record variable rec1
represents a partial row of the employees
table—the columns last_name
and employee_id
. The SELECT
INTO
statement selects from employees
the row for which job_id
is 'AD_PRES'
and assigns the values of the columns last_name
and employee_id
in that row to the corresponding fields of rec1
.
DECLARE TYPE RecordTyp IS RECORD ( last employees.last_name%TYPE, id employees.employee_id%TYPE ); rec1 RecordTyp; BEGIN SELECT last_name, employee_id INTO rec1 FROM employees WHERE job_id = 'AD_PRES'; DBMS_OUTPUT.PUT_LINE ('Employee #' || rec1.id || ' = ' || rec1.last); END; /
Result:
Employee #100 = King
Using FETCH to Assign a Row to a Record Variable
The syntax of a simple FETCH
statement is:
FETCH cursor INTO record_variable_name;
A cursor is associated with a query. For every column that the query selects, the record variable must have a corresponding, type-compatible field. The cursor must be either an explicit cursor or a strong cursor variable.
See Also:
-
"FETCH Statement" for complete syntax
-
"Cursors Overview" for information about all cursors
-
"Explicit Cursors" for information about explicit cursors
-
"Cursor Variables" for information about cursor variables
Example 6-57 FETCH Assigns Values to Record that Function Returns
In this example, each variable of RECORD
type EmpRecTyp
represents a partial row of the employees
table—the columns employee_id
and salary
. Both the cursor and the function return a value of type EmpRecTyp
. In the function, a FETCH
statement assigns the values of the columns employee_id
and salary
to the corresponding fields of a local variable of type EmpRecTyp
.
DECLARE
TYPE EmpRecTyp IS RECORD (
emp_id employees.employee_id%TYPE,
salary employees.salary%TYPE
);
CURSOR desc_salary RETURN EmpRecTyp IS
SELECT employee_id, salary
FROM employees
ORDER BY salary DESC;
highest_paid_emp EmpRecTyp;
next_highest_paid_emp EmpRecTyp;
FUNCTION nth_highest_salary (n INTEGER) RETURN EmpRecTyp IS
emp_rec EmpRecTyp;
BEGIN
OPEN desc_salary;
FOR i IN 1..n LOOP
FETCH desc_salary INTO emp_rec;
END LOOP;
CLOSE desc_salary;
RETURN emp_rec;
END nth_highest_salary;
BEGIN
highest_paid_emp := nth_highest_salary(1);
next_highest_paid_emp := nth_highest_salary(2);
DBMS_OUTPUT.PUT_LINE(
'Highest Paid: #' ||
highest_paid_emp.emp_id || ', $' ||
highest_paid_emp.salary
);
DBMS_OUTPUT.PUT_LINE(
'Next Highest Paid: #' ||
next_highest_paid_emp.emp_id || ', $' ||
next_highest_paid_emp.salary
);
END;
/
Result:
Highest Paid: #100, $24000 Next Highest Paid: #101, $17000
Using SQL Statements to Return Rows in PL/SQL Record Variables
The SQL statements INSERT
, UPDATE
, and DELETE
have an optional RETURNING
INTO
clause that can return the affected row in a PL/SQL record variable.
For information about this clause, see "RETURNING INTO Clause".
Example 6-58 UPDATE Statement Assigns Values to Record Variable
In this example, the UPDATE
statement updates the salary of an employee and returns the name and new salary of the employee in a record variable.
DECLARE TYPE EmpRec IS RECORD ( last_name employees.last_name%TYPE, salary employees.salary%TYPE ); emp_info EmpRec; old_salary employees.salary%TYPE; BEGIN SELECT salary INTO old_salary FROM employees WHERE employee_id = 100; UPDATE employees SET salary = salary * 1.1 WHERE employee_id = 100 RETURNING last_name, salary INTO emp_info; DBMS_OUTPUT.PUT_LINE ( 'Salary of ' || emp_info.last_name || ' raised from ' || old_salary || ' to ' || emp_info.salary ); END; /
Result:
Salary of King raised from 24000 to 26400
Assigning NULL to a Record Variable
Assigning the value NULL
to a record variable assigns the value NULL
to each of its fields.
This assignment is recursive; that is, if a field is a record, then its fields are also assigned the value NULL
.
Example 6-59 Assigning NULL to Record Variable
This example prints the fields of a record variable (one of which is a record) before and after assigning NULL
to it.
DECLARE
TYPE age_rec IS RECORD (
years INTEGER DEFAULT 35,
months INTEGER DEFAULT 6
);
TYPE name_rec IS RECORD (
first employees.first_name%TYPE DEFAULT 'John',
last employees.last_name%TYPE DEFAULT 'Doe',
age age_rec
);
name name_rec;
PROCEDURE print_name AS
BEGIN
DBMS_OUTPUT.PUT(NVL(name.first, 'NULL') || ' ');
DBMS_OUTPUT.PUT(NVL(name.last, 'NULL') || ', ');
DBMS_OUTPUT.PUT(NVL(TO_CHAR(name.age.years), 'NULL') || ' yrs ');
DBMS_OUTPUT.PUT_LINE(NVL(TO_CHAR(name.age.months), 'NULL') || ' mos');
END;
BEGIN
print_name;
name := NULL;
print_name;
END;
/
Result:
John Doe, 35 yrs 6 mos NULL NULL, NULL yrs NULL mos