Dear readers of our blog, we'd like to recommend you to visit the main page of our website, where you can learn about our product SQLS*Plus and its advantages.
 
SQLS*Plus - best SQL Server command line reporting and automation tool! SQLS*Plus is several orders of magnitude better than SQL Server sqlcmd and osql command line tools.
 

REQUEST COMPLIMENTARY SQLS*PLUS LICENCE

Enteros UpBeat offers a patented database performance management SaaS platform. It proactively identifies root causes of complex revenue-impacting database performance issues across a growing number of RDBMS, NoSQL, and deep/machine learning database platforms. We support Oracle, SQL Server, IBM DB2, MongoDB, Casandra, MySQL, Amazon Aurora, and other database systems.

Oracle FIRST and LAST methods

26 August 2020

Oracle FIRST and LAST methods

In Oracle PL/SQL the FIRST and LAST methods are functions. If there is at least one element in the collection, FIRST and LAST return the indexes of the first and last element respectively (ignoring the deleted elements, even if DELETE stores fillers for them).

If the collection has only one element, FIRST and LAST return the same index. If the collection is empty, FIRST and LAST return NULL.

Syntax of FIRST and LAST collection methods in Oracle PL/SQL

collection_name.FIRST;
collection_name.LAST;

Method parameters or arguments

  • collection_name – types of collection.
  • FIRST – index of the first element of the collection.
  • LAST – index of the last element of the collection.

Consider some examples to understand how to use FIRST and LAST collection methods in Oracle PL/SQL.

For Associative Arrays (associative array) indexed with integers, the first and last elements are those with the smallest and largest indexes respectively.

Let’s look at an example that shows the FIRST and LAST values for Associative Arrays indexed with integers, removes the first and last element and shows FIRST and LAST values again.

DECLARE
TYPE aa_type_int IS TABLE OF INTEGER INDEX BY PLS_INTEGER;
aa_int aa_type_int;

PROCEDURE print_first_and_last IS
BEGIN
DBMS_OUTPUT.PUT_LINE('FIRST = ' || aa_int.FIRST);
DBMS_OUTPUT.PUT_LINE('LAST = ' || aa_int.LAST);
END print_first_and_last;

BEGIN
aa_int(1) := 3;
aa_int(2) := 6;
aa_int(3) := 9;
aa_int(4) := 12;

DBMS_OUTPUT.PUT_LINE('Before deletions:');
print_first_and_last;

aa_int.DELETE(1);
aa_int.DELETE(4);

DBMS_OUTPUT.PUT_LINE('After deletions:');
print_first_and_last;
END;

Result:
Before deletions:
FIRST = 1
LAST = 4
After deletions:
FIRST = 2
LAST = 3

For Indexed Arrays, the first and last elements are those with the lowest and highest key values respectively. The values of the key are in sorted order.

The following example shows the FIRST and LAST values for Associative Arrays indexed by string, removes the first and last element and shows the FIRST and LAST values again.

DECLARE
TYPE aa_type_str IS TABLE OF INTEGER INDEX BY VARCHAR2(10);
aa_str aa_type_str;

PROCEDURE print_first_and_last IS
BEGIN
DBMS_OUTPUT.PUT_LINE('FIRST = ' || aa_str.FIRST);
DBMS_OUTPUT.PUT_LINE('LAST = ' || aa_str.LAST);
END print_first_and_last;

BEGIN
aa_str('Z') := 26;
aa_str('A') := 1;
aa_str('K') := 11;
aa_str('R') := 18;

DBMS_OUTPUT.PUT_LINE('Before deletions:');
print_first_and_last;

aa_str.DELETE('A');
aa_str.DELETE('Z');

DBMS_OUTPUT.PUT_LINE('After deletions:');
print_first_and_last;
END;

Result:
Before deletions:
FIRST = A
LAST = Z
After deletions:
FIRST = K
LAST = R

Examples of FIRST and LAST methods for Varray

For not empty Varray, FIRST always returns 1.
For each varray LAST is always COUNT. For example.

DECLARE
TYPE NumList IS VARRAY(10) OF INTEGER;
n NumList := NumList(1,3,5,7);

PROCEDURE print_count_and_last IS
BEGIN
DBMS_OUTPUT.PUT('n.COUNT = ' || n.COUNT || ', ');
DBMS_OUTPUT.PUT_LINE('n.LAST = ' || n.LAST);
END print_count_and_last;

BEGIN
print_count_and_last;

n.EXTEND(3);
print_count_and_last;

n.TRIM(5);
print_count_and_last;
END;

Result:
n.COUNT = 4, n.LAST = 4
n.COUNT = 7, n.LAST = 7
n.COUNT = 2, n.LAST = 2

The following example prints the Varray team using the FOR LOOP cycle with the team.FIRST and team.LAST limits. Since Varray is always limited, the team(i) inside the loop always exists.

DECLARE
TYPE team_type IS VARRAY(4) OF VARCHAR2(15);
team team_type;

PROCEDURE print_team (heading VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.PUT_LINE(heading);

IF team IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Does not exist');
ELSIF team.FIRST IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Has no members');
ELSE
FOR i IN team.FIRST. team.LAST LOOP
DBMS_OUTPUT.PUT_LINE(i || '. ' || team(i));
END LOOP;
END IF;

DBMS_OUTPUT.PUT_LINE('---');
END;

BEGIN
print_team('Team Status:');

team := team_type(); -- The command is created, but there is nobody in it.
print_team('Team Status:');

team := team_type('John', 'Mary'); -- 2 members added to the team.
print_team('Initial Team:');

team := team_type('Arun', 'Amitha', 'Allan', 'Mae'); -- Team replacement.
print_team('New Team:');
END;
Result:
Team Status:
Does not exist
---
Team Status:
Has no members
---
Initial Team:
1. John
2. Mary
---
New Team:
1. Arun
2. Amitha
3. Allan
4. Mae
---

Examples of FIRST and LAST methods for Nested Tables

For Nested Tables, LAST is COUNT unless you remove items from the middle of the Nested Tables, in which case LAST is larger than COUNT.

Let’s look at an example which is printed by the Nested Tables team using the FOR LOOP loop in the team.FIRST and team.LAST ranges. Since Nested Tables can be unlimited, the FOR LOOP operator prints the team(i) only if team.EXISTS(i) has the value TRUE.

DECLARE
TYPE team_type IS TABLE OF VARCHAR2(15);
team team_type;

PROCEDURE print_team (heading VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(heading);

IF team IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Does not exist');
ELSIF team.FIRST IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Has no members');
ELSE
FOR i IN team.FIRST. team.LAST LOOP
DBMS_OUTPUT.PUT (i || '. ');
IF team.EXISTS(i) THEN
DBMS_OUTPUT.PUT_LINE(team(i));
ELSE
DBMS_OUTPUT.PUT_LINE('(to be hired)');
END IF;
END LOOP;
END IF;

DBMS_OUTPUT.PUT_LINE('---');
END;

BEGIN
print_team('Team Status:');

team := team_type(); -- The command is created, but there is nobody in it.
print_team('Team Status:');

team := team_type('Arun', 'Amitha', 'Allan', 'Mae'); -- Adds members.
print_team('Initial Team:');

team.DELETE(2,3); -- Removes the 2nd and 3rd members.
print_team('Current Team:');
END;
Result:
Team Status:
Does not exist
---
Team Status:
Has no members
---
Initial Team:
1. Arun
2. Amitha
3. Allan
4. Mae
---
Current Team:
1. Arun
2. (to be hired)
3. (to be hired)
4. Mae
---

PL/SQL tutorial: Collection Method FIRST & LAST in Oracle Database

 
Tags: , , , , ,

MORE NEWS

 

Preamble​​NoSql is not a replacement for SQL databases but is a valid alternative for many situations where standard SQL is not the best approach for...

Preamble​​MongoDB Conditional operators specify a condition to which the value of the document field shall correspond.Comparison Query Operators $eq...

5 Database management trends impacting database administrationIn the realm of database management systems, moreover half (52%) of your competitors feel...

The data type is defined as the type of data that any column or variable can store in MS SQL Server. What is the data type? When you create any table or...

Preamble​​MS SQL Server is a client-server architecture. MS SQL Server process starts with the client application sending a query.SQL Server accepts,...

First the basics: what is the master/slave?One database server (“master”) responds and can do anything. A lot of other database servers store copies of all...

Preamble​​Atom Hopper (based on Apache Abdera) for those who may not know is an open-source project sponsored by Rackspace. Today we will figure out how to...

Preamble​​MongoDB recently introduced its new aggregation structure. This structure provides a simpler solution for calculating aggregated values rather...

FlexibilityOne of the most advertised features of MongoDB is its flexibility.  Flexibility, however, is a double-edged sword. More flexibility means more...

Preamble​​SQLShell is a cross-platform command-line tool for SQL, similar to psql for PostgreSQL or MySQL command-line tool for MySQL.Why use it?If you...

Preamble​​Writing an application on top of the framework on top of the driver on top of the database is a bit like a game on the phone: you say “insert...

Preamble​​Oracle Coherence is a distributed cache that is functionally comparable with Memcached. In addition to the basic function of the API cache, it...

Preamble​​IBM pureXML, a proprietary XML database built on a relational mechanism (designed for puns) that offers both relational ( SQL / XML ) and...

  What is PostgreSQL array? In PostgreSQL we can define a column as an array of valid data types. The data type can be built-in, custom or enumerated....

Preamble​​If you are a Linux sysadmin or developer, there comes a time when you need to manage an Oracle database that can work in your environment.In this...

Preamble​​Starting with Microsoft SQL Server 2008, by default, the group of local administrators is no longer added to SQL Server administrators during the...