Working with tabular data blocks is one of the most common tasks in Oracle Forms. Many times, developers need to process each record in a block one by one — whether for validation, updates, calculations, or passing values to another system. Knowing how to properly Loop Through a Tabular Data Block in Oracle Forms helps ensure efficient and error-free applications.
In this article, you will learn the different ways to loop through records in a block, the built-in functions that make this easier, and practical coding examples you can use directly in your Oracle Forms development projects.
Understanding Tabular Data Blocks in Oracle Forms
A tabular data block in Oracle Forms is essentially a block that can display multiple records at the same time in a table-like format. Unlike a single-record form, a tabular block allows navigation from one row to another, which makes it suitable for tasks like order lines, employee lists, or transaction entries.
When you want to loop through such a block, you are essentially moving the cursor from the first record to the last record and performing certain actions for each row.
Why Looping Through a Tabular Data Block is Needed
Looping through records is often necessary for business logic, data validation, or integration. Here are some common use cases:
- Validating data in each row before committing a transaction.
- Calculating totals or derived values across multiple rows.
- Copying or exporting records to another block or application.
- Applying conditional updates to specific records.
- Passing values from Oracle Forms to Oracle Reports or APIs.
Built-in Functions for Block Navigation
Oracle Forms provides several built-in functions that help you loop through tabular blocks. The most commonly used are:
- FIRST_RECORD: Moves the cursor to the first record in the block.
- NEXT_RECORD: Moves the cursor to the next record.
- LAST_RECORD: Moves the cursor to the last record.
- SYSTEM.LAST_RECORD: A system variable that indicates whether the cursor is on the last record.
- SYSTEM.CURSOR_RECORD: Returns the current record number in the block.
- SYSTEM.CURSOR_BLOCK: Returns the name of the current block where the cursor is located.
These functions form the backbone of record navigation.
Basic Approach to Loop Through a Tabular Data Block
The typical logic for looping through a tabular block follows a simple structure:
- Go to the first record.
- Perform the required operation.
- Check if it is the last record.
- If not the last, move to the next record.
- Repeat until all records are processed.
This flow can be implemented with a LOOP statement in PL/SQL.
Example: Looping Through Records in a Tabular Block
Here is a simple code snippet that demonstrates how to loop through a tabular data block in Oracle Forms:
DECLARE
v_total_salary NUMBER := 0;
BEGIN
GO_BLOCK('EMP_BLOCK');
FIRST_RECORD;
LOOP
v_total_salary := v_total_salary + :EMP_BLOCK.SALARY;
EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
NEXT_RECORD;
END LOOP;
MESSAGE('Total Salary: ' || v_total_salary);
MESSAGE(' ');
END;
Explanation:
GO_BLOCK('EMP_BLOCK')ensures you are working in the correct block.FIRST_RECORDmoves the cursor to the first record.- Inside the loop, the salary is accumulated.
- The condition
EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE'ensures the loop stops after the last record. - Finally, the total salary is displayed.
Example: Updating All Records in a Tabular Block
Sometimes you need to update a field across all records in a block. Here’s how you can do that:
BEGIN
GO_BLOCK('ORDER_LINES');
FIRST_RECORD;
LOOP
:ORDER_LINES.STATUS := 'VALIDATED';
EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
NEXT_RECORD;
END LOOP;
END;
This block of code loops through all order line records and marks the status as "VALIDATED".
Using FORMS Built-ins vs FOR Loop with Record Count
Another approach is to use a FOR loop along with GET_BLOCK_PROPERTY. This is useful when you need more control:
DECLARE
v_record_count NUMBER;
i NUMBER;
BEGIN
v_record_count := GET_BLOCK_PROPERTY('EMP_BLOCK', RECORDS_DISPLAYED);
FOR i IN 1 .. v_record_count LOOP
GO_RECORD(i);
:EMP_BLOCK.FLAG := 'Y';
END LOOP;
END;
Here, the loop runs based on the number of displayed records. This approach is helpful when you want to explicitly address each row by its position.
Best Practices for Looping in Tabular Data Blocks
When looping through records, keep in mind these important practices:
- Use GO_BLOCK first: Always ensure you are on the correct block before looping.
- Minimize navigation calls: Excessive use of
NEXT_RECORDorGO_RECORDcan slow performance. - Validate inside the loop: If performing checks, add exit conditions for efficiency.
- Use system variables wisely: They prevent unnecessary errors and improve readability.
- Consider user experience: If looping through many records, show progress or use asynchronous processes.
Common Errors and Troubleshooting
While looping through tabular blocks, developers often face errors. Here are a few common ones:
- FRM-40102: Record must be entered or deleted first – Occurs if you try to navigate without committing changes.
- FRM-41009: Function cannot be performed here – Happens if you call navigation commands from restricted triggers like
WHEN-VALIDATE-ITEM. - Infinite Loops – Can occur if exit conditions are not properly defined. Always ensure your
EXIT WHENis correctly coded.
When Not to Loop Manually
Although looping is a powerful technique, sometimes it may not be necessary. For example:
- If you just want a total, you can calculate it with SQL directly.
- If you need to update all records, a
UPDATEstatement may be faster than looping. - Use looping mainly when interaction with form fields or built-in triggers is required.
Conclusion
Learning how to Loop Through a Tabular Data Block in Oracle Forms is an essential skill for Oracle Forms developers. Whether you are validating data, performing calculations, or updating multiple rows, looping gives you precise control over the records in your block. By using built-in navigation functions like FIRST_RECORD, NEXT_RECORD, and system variables such as SYSTEM.LAST_RECORD, you can implement reliable and efficient loops.
Always remember to follow best practices, keep performance in mind, and only use looping when it is truly necessary. With these techniques, you can make your Oracle Forms applications more powerful, user-friendly, and maintainable.

