03 Working with composite data types

PL/SQL Records

What are records?

Records are another type of datatypes which oracle allows to be defined as a placeholder.

Records are composite datatypes, which means it is a combination of different scalar datatypes like char, varchar, number etc.

Each scalar data types in the record holds a value.

A record can be visualized as a row of data. It can contain all the contents of a row.

Declaring a record:

To declare a record, you must first define a composite datatype; then declare a record for that type.

The General Syntax to define a composite datatype is:

TYPE record_type_name IS RECORD

(first_col_name column_datatype,

second_col_name column_datatype, ...);

  • record_type_name – it is the name of the composite type you want to define.

  • first_col_name, second_col_name, etc.,- it is the names the fields/columns within the record.

  • column_datatype defines the scalar datatype of the fields.

There are different ways you can declare the datatype of the fields.

1) You can declare the field in the same way as you declare the fields while creating the table.

Example

set serveroutput ON;

DECLARE

TYPE punonjes IS RECORD

(

kodi number,

emri varchar(50),

mbiemri varchar(50),

fillimi_punes date

);

p2 punonjes;

p1 punonjes;

BEGIN

dbms_output.put_line('Shembull deklarimi rekordesh');

END;

2) If a field is based on a column from database table, you can define the field_type as follows:

col_name table_name.column_name%type;

By declaring the field datatype in the above method, the datatype of the column is dynamically applied to the field.

This method is useful when you are altering the column specification of the table, because you do not need to change the code again.

The General Syntax to declare a record of a user-defined datatype is:

record_name record_type_name;

The following code shows how to declare a record called employee_rec based on a user-defined type.

DECLARE

TYPE employee_type IS RECORD

(

employee_id number(5),

employee_first_name varchar2(25),

employee_last_name employee.last_name%type,

employee_dept employee.dept%type

);

employee_salary employee.salary%type;

employee_rec employee_type;

Exercice

Declare e record for storing the data of a department as illustrated below:

Kodi

number

Emri

type of departmentname

Vendondodhja

varchar(100)

Solution

set serveroutput ON;

DECLARE

TYPE dept IS RECORD

(

kodi number,

emri departments.department_name%type,

vendnodhja varchar(100)

);

d1 dept;

BEGIN

dbms_output.put_line('Shembull deklarimi rekordesh');

END;

Exercice

Declare a record to hold the data related an employee as follows:

Solution

set serveroutput ON;

DECLARE

TYPE punonjes IS RECORD

(

kodi employees.employee_id%type,

emri employees.first_name%type,

mbiemri employees.last_name%type,

departamenti departments.department_name%type

);

p1 punonjes;

BEGIN

dbms_output.put_line('Shembull deklarimi rekordesh');

END;

If all the fields of a record are based on the columns of a table, we can declare the record as follows:

record_name table_name%ROWTYPE;

For example, the above declaration of employee_rec can as follows:

DECLARE

employee_rec employee%ROWTYPE;

The advantages of declaring the record as a ROWTYPE are:

1) You do not need to explicitly declare variables for all the columns in a table.

2) If you alter the column specification in the database table, you do not need to update the code.

The disadvantage of declaring the record as a ROWTYPE is:

1) When you create a record as a ROWTYPE, fields will be created for all the columns in the table and memory will be used to create the datatype for all the fields.

So use ROWTYPE only when you are using all the columns of the table in the program.

NOTE: When you are creating a record, you are just creating a datatype, similar to creating a variable.

You need to assign values to the record to use them.

The following table consolidates the different ways in which you can define and declare a pl/sql record.

Assigning Values

When you assign values to a record, you actually assign values to the fields within it.

Method 1 - Direct Assignment

The General Syntax to assign a value to a column within a record direclty is:

record_name.col_name := value;

Method 2 - Value Assignment through SELECT

We can assign values to records using SELECT Statements as shown:

SELECT col1, col2

INTO record_name.col_name1, record_name.col_name2

FROM table_name

[WHERE clause];

If %ROWTYPE is used to declare a record then you can directly assign values to the whole record instead of each columns separately.

In this case, you must SELECT all the columns from the table into the record as shown:

SELECT * INTO record_name

FROM table_name

[WHERE clause];

Getting values from a record

Lets see how we can get values from a record.

The General Syntax to retrieve a value from a specific field into another variable is:

var_name := record_name.col_name;

The following table consolidates the different ways you can assign values to and from a record: