Prerequisites
Before we begin, here are the requirements for following along with this guide:
Database: Oracle Database (since PL/SQL is Oracle-specific).
The syntax, examples, and stored procedures/functions in this tutorial are based on Oracle PL/SQL only.
Other databases (e.g., MySQL, PostgreSQL) have different procedural languages and syntax.
Introduction
PL/SQL (Procedural Language / SQL) is Oracle’s extension of SQL.
It adds programming features (like loops, conditions, procedures, and error handling) on top of SQL. It allows you to combine SQL statements with procedural logic.
PL/SQL Block
A block is a basic unit of code (procedures, functions, and anonymous blocks) that make up the PL/SQL program logical. A PL/SQL block includes three sections: declaration, executable, and exception-handling sections. The executable section is mandatory, while others are optional.
Types of PL/SQL Blocks
- Anonymous Blocks
- Not stored in the database.
- Written and executed directly (like test scripts).
- Named Blocks
- Stored in the database for reuse.
- Examples: Procedures, Functions, Packages, Triggers.
An anonymous block
A block without a name is an anonymous block. An anonymous block is not saved in the Oracle Database server, so it is just for one-time use. However, PL/SQL anonymous blocks can be useful for testing purposes.
Example
SET SERVEROUTPUT ON;
declare
p_emp table_emp%rowtype;
begin
select * into p_emp from table_emp where emp_id='123456';
dbms_output.put_line('Result:'|| p_emp.name || p_emp.emp_id);
exception
when NO_DATA_FOUND
then
dbms_output.put_line('No Result:');
end;
/
The slash (/) executes the block.
Functions or Procedures (named Block)
Functions or Procedures is an example of a named block. A named block is stored in the Oracle Database server and can be reused later.
Create Procedure Example
create or replace procedure getEmpById(id in varchar2)
AS
p_emp table_emp%rowtype;
begin
select * into p_emp from table_emp where emp_id=id;
dbms_output.put_line('Result:'|| p_emp.name || p_emp.emp_id);
end ;
Execute procedure
begin
getEmpById('12345');
end;
OR
exec getEmpById('12345');
Delete procedure
drop procedure getEmpById;
Create Function Example
create or replace function getEmpById(id in varchar2)
return varchar2
IS
p_name varchar2(255);
begin
select name into p_name from table_emp where emp_id=id;
return(p_name);
end;
Execute function
select getEmpById('123456') from dual;
OR
declare
num number := &emp_id;
e_name varchar2(255);
begin
e_name := getEmpById(num);
dbms_output.put_line('the employee name '|| e_name);
end;
/
Delete function
drop function getEmpById;
Calling a Stored Procedure with Spring Data JPA
Stored procedures with Spring Data JPA (or any framework) come with pros and cons. Here’s a balanced view:
@Procedure Annotation
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Procedure(procedureName = "increase_salary")
void increaseSalary(@Param("p_emp_id") Long empId, @Param("p_percent") Double percent);
}
@NamedStoredProcedureQuery
@Entity
@NamedStoredProcedureQuery(
name = "Employee.increaseSalary",
procedureName = "increase_salary",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, name = "p_emp_id", type = Long.class),
@StoredProcedureParameter(mode = ParameterMode.IN, name = "p_percent", type = Double.class)
}
)
public class Employee {
@Id
private Long empId;
private String name;
}
Repository:
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Procedure(name = "Employee.increaseSalary")
void increaseSalary(@Param("p_emp_id") Long empId, @Param("p_percent") Double percent);
}
Main Use Cases of PL/SQL Blocks
- Data Processing – update/modify data in bulk.
- Business Logic & Validation – enforce rules beyond SQL constraints.
- Error Handling – gracefully manage runtime errors.
- Automation via triggers – run logic on INSERT/UPDATE/DELETE.
- Reusable Code – stored procedures & functions.
- Batch Jobs & Scheduling – cleanup, reporting, automation tasks.
- Complex Transactions – ensure atomic operations (commit/rollback).
Rule of thumb:
- Use stored procedures for heavy DB operations, bulk processing, and centralized business rules.
- Use JPA queries for simple, CRUD-like operations and portability.
Top comments (0)