pl-sql
  1. pl-sql-patterns

Patterns - (PL/SQL Misc)

PL/SQL is a procedural language used to develop applications, including stored procedures and triggers, in Oracle databases. In addition to its programming features, PL/SQL also supports the use of patterns to make code more concise, efficient, and maintainable.

Syntax

The syntax for using patterns in PL/SQL code will depend on the specific pattern being used. Some common pattern examples and their syntax include:

Singleton Pattern

CREATE OR REPLACE PACKAGE MySingleton AS
  INSTANCE CONSTANT MySingletonInstance := MySingletonInstance.new;
END MySingleton;

Factory Pattern

CREATE OR REPLACE TYPE EmpRecType AS OBJECT (
    EmpID     NUMBER(6),
    EmpName   VARCHAR2(50),
    HireDate  DATE,
    Salary    NUMBER(10,2)
);

CREATE OR REPLACE PACKAGE EmpFactory AS
    FUNCTION CreateEmp (
        EmpID     NUMBER(6),
        EmpName   VARCHAR2(50),
        HireDate  DATE,
        Salary    NUMBER(10,2)
    ) RETURN EmpRecType;
END EmpFactory;

CREATE OR REPLACE PACKAGE BODY EmpFactory AS
    FUNCTION CreateEmp (
        EmpID     NUMBER(6),
        EmpName   VARCHAR2(50),
        HireDate  DATE,
        Salary    NUMBER(10,2)
    ) RETURN EmpRecType AS
    BEGIN
        RETURN EmpRecType(
            EmpID,
            EmpName,
            HireDate,
            Salary
        );
    END CreateEmp;
END EmpFactory;

Iterator Pattern

CREATE OR REPLACE PACKAGE MyList AS
  TYPE ListRec IS RECORD (
    Value  NUMBER,
    Next   PLS_INTEGER := NULL
  );

  TYPE ListArray IS TABLE OF ListRec INDEX BY PLS_INTEGER;

  PROCEDURE AddItem (Value IN INTEGER);
  PROCEDURE RemoveItem (Index IN INTEGER);
  PROCEDURE Iterate (Callback IN OUT NOCOPY FUNCTION (L IS IN ListArray, Index IN INTEGER) RETURN BOOLEAN);
END MyList;

CREATE OR REPLACE PACKAGE BODY MyList AS
  List ListArray;
  Index PLS_INTEGER := 1;

  PROCEDURE AddItem (Value IN INTEGER) IS
  BEGIN
    List(Index).Value := Value;
    IF Index > 1 THEN
      List(Index - 1).Next := Index;
    END IF;
    Index := Index + 1;
  END AddItem;

  PROCEDURE RemoveItem (Index IN INTEGER) IS
  BEGIN
    IF List(Index).Next IS NULL THEN
      List(Index - 1).Next := NULL;
    ELSE
      List(Index - 1).Next := List(Index).Next;
      List(Index).Next := NULL;
      FOR I IN Index+1..List.COUNT LOOP
        List(I-1) := List(I);
      END LOOP;
    END IF;
    List.DELETE(List.COUNT);
    Index := Index - 1;
  END RemoveItem;

  PROCEDURE Iterate (Callback IN OUT NOCOPY FUNCTION (L IS IN ListArray, Index IN INTEGER) RETURN BOOLEAN) IS
  BEGIN
    FOR I IN List.FIRST..List.LAST LOOP
      IF NOT Callback(List, I) THEN
        EXIT;
      END IF;
    END LOOP;
  END Iterate;
END MyList;

Example

CREATE OR REPLACE PACKAGE MySingleton AS
  INSTANCE CONSTANT MySingletonInstance := MySingletonInstance.new;
END MySingleton;

In this example, we create a package called MySingleton that implements the Singleton pattern. The package defines a constant MySingletonInstance that is an instance of the MySingleton package, ensuring that only one instance of the package is created in memory.

CREATE OR REPLACE TYPE EmpRecType AS OBJECT (
    EmpID     NUMBER(6),
    EmpName   VARCHAR2(50),
    HireDate  DATE,
    Salary    NUMBER(10,2)
);

CREATE OR REPLACE PACKAGE EmpFactory AS
    FUNCTION CreateEmp (
        EmpID     NUMBER(6),
        EmpName   VARCHAR2(50),
        HireDate  DATE,
        Salary    NUMBER(10,2)
    ) RETURN EmpRecType;
END EmpFactory;

CREATE OR REPLACE PACKAGE BODY EmpFactory AS
    FUNCTION CreateEmp (
        EmpID     NUMBER(6),
        EmpName   VARCHAR2(50),
        HireDate  DATE,
        Salary    NUMBER(10,2)
    ) RETURN EmpRecType AS
    BEGIN
        RETURN EmpRecType(
            EmpID,
            EmpName,
            HireDate,
            Salary
        );
    END CreateEmp;
END EmpFactory;

In this example, we create a package called EmpFactory that implements the Factory pattern. The package defines a type EmpRecType that represents a record containing employee information. The package also includes a function called CreateEmp() that creates a new EmpRecType object and returns it.

Output

The output of using patterns in PL/SQL code is more concise, efficient, and maintainable code. However, the output will depend on the specific pattern being used and the code being written.

Explanation

Patterns in PL/SQL code are used to make code more concise, efficient, and maintainable. The specific syntax used will depend on the pattern being used, such as the Singleton, Factory, or Iterator pattern.

Use

Using patterns in PL/SQL code can make the code easier to read, improve maintainability, and reduce the amount of code that needs to be written. However, it's important to use patterns that are appropriate for the specific situation and to ensure that the code remains readable and maintainable.

Important Points

  • Patterns in PL/SQL code can make code more efficient, concise, and maintainable.
  • Different patterns may require different syntax and code structures.
  • The patterns used should be appropriate for the specific situation and ensure that the code remains readable and maintainable.

Summary

In summary, patterns can be used in PL/SQL code to make the code more efficient, concise, and maintainable. Examples of patterns that can be used include Singleton, Factory, and Iterator patterns. It is important to use appropriate patterns for the specific situation and to ensure that the resulting code remains readable and maintainable.

Published on: