Skip to main content

PRAGMA RESTRICT_REFERENCES

 

Pragma Introduction

In my package's functions and procedure, sometimes I have some rules to control purity rules of the database,  like reading from tables only, not query the database, ...... etc 
So I will  use 
PRAGMA RESTRICT_REFERENCES to control and preserve the database state in database packages.

Syntax of 
PRAGMA RESTRICT_REFERENCES

PRAGMA RESTRICT_REFERENCES(SUBPROGRAM_NAME, IDENTIFIER)


SUBPROGRAM_NAME can be default which will affect all the subprograms in packages or subprogram name(function or procedure) in package

IDENTIFIER can be RNDS, WNDS, RNPS, WNPS and TRUST. I will explain every one separately.

1- RNDS

select query is restricted against any of database tables

2- WNDS

DML operations are restricted against any of database tables 

3- RNPS

Selection of package variables is restricted 

4- WNPS

Modification in packages variables is restricted

5- TRUST

Asserts that the subprogram can be trusted not to violate one or more rules


Demo

Test WNPS 
let's create packages 
XXX_PKG contains GN$USER package variables and SET_USER function to set GN$USER and I will use WNPS purity check in SET_USER function


 CREATE OR REPLACE PACKAGE XXX_PKG 

 AS 

   GN$USER  VARCHAR2 (100); 

  

   PROCEDURE SET_USER; 

  

   PRAGMA RESTRICT_REFERENCES (SET_USER, WNPS); 

 END; 

  

 CREATE OR REPLACE PACKAGE BODY XXX_PKG 

 AS 

   PROCEDURE SET_USER 

   IS 

   BEGIN 

    GN$USER := 'Mahmoud A. El-Sayed'; 

   END; 

 END; 


When compile the package body compiler will raise the below error
PLS-00452: Subprogram 'SET_USER' violates its associated pragma

Test RNDS
let's create packages 
XXX_PKG contains GET_EMPLOYEE_NAME function which query from EMP database table.

 CREATE OR REPLACE PACKAGE XXX_PKG 

 AS 

   FUNCTION GET_EMPLOYEE_NAME (IN_EMPLOYEE_ID NUMBER) 

    RETURN VARCHAR2; 

  

   PRAGMA RESTRICT_REFERENCES (GET_EMPLOYEE_NAME, RNDS); 

 END; 

  

 CREATE OR REPLACE PACKAGE BODY XXX_PKG 

 AS 

   FUNCTION GET_EMPLOYEE_NAME (IN_EMPLOYEE_ID NUMBER) 

    RETURN VARCHAR2 

   IS 

    LV$EMPLOYEE_NAME  VARCHAR2 (100); 

   BEGIN 

    SELECT ENAME 

     INTO LV$EMPLOYEE_NAME 

     FROM EMP 

     WHERE EMPNO = IN_EMPLOYEE_ID; 

  

    RETURN LV$EMPLOYEE_NAME; 

   END; 

 END; 


When compile the package body compiler will raise the below error
PLS-00452: Subprogram 'GET_EMPLOYEE_NAME' violates its associated pragma

You can test the others purity checks, Just I made two examples to illustrate the idea.


one more easy example to check :


CREATE OR REPLACE PACKAGE rnds_PKG

 AS

   FUNCTION GET_EMPLOYEE_NAME (IN_EMPLOYEE_ID NUMBER)

    RETURN VARCHAR2;

  -- PRAGMA RESTRICT_REFERENCES (GET_EMPLOYEE_NAME, RNDS);

 END;



CREATE OR REPLACE PACKAGE BODY rnds_PKG

 AS

   FUNCTION GET_EMPLOYEE_NAME (IN_EMPLOYEE_ID NUMBER)

    RETURN VARCHAR2

   IS

    v_EMPLOYEE_NAME  VARCHAR2 (100);

   BEGIN

    SELECT ENAME

     INTO v_EMPLOYEE_NAME

     FROM EMP

     WHERE EMPNO = IN_EMPLOYEE_ID;

    RETURN v_EMPLOYEE_NAME;

   END;

 END;

select rnds_pkg.get_employee_name(7369) from dual;




Comments

Popular posts from this blog

PL / SQL practice programs

  PL / SQL  practice programs 1. Write a program to print the following format WELCOME TO PL/SQL PROGRAMMING   BEGIN   DBMS_OUTPUT.PUT_LINE('WELCOME   TO   PL/SQL   PROGRAMMING'); END; /   2. Write a program to print the numbers from 1 to 100   DECLARE N NUMBER(3):=1; V VARCHAR2(1000); BEGIN WHILE N <=1000 LOOP V:=V||''||N; N:=N+1; END LOOP; DBMS_OUTPUT.PUT_LINE(V); END; / 3. write a program to print the even numbers from 1 to 100 DECLARE N NUMBER(3):=0; BEGIN WHILE N <=100 LOOP N:=N+2; DBMS_OUTPUT.PUT_LINE(N); END LOOP; END; / 4. Write a program to print the odd numbers from 1 to 100 DECLARE N NUMBER(3):=1; BEGIN WHILE N <=100 LOOP N:=N+2; DBMS_OUTPUT.PUT_LINE(N); END LOOP; END; / 5. write a program for multiplication table DECLARE A NUMBER(2):=&A; B   NUMBER(2):=1; C   NUMBER(3); BEGIN WHILE B <

RDBMS MINI PROJECT

  Capgemini class room training.   RDBMS MINI PROJECT ( SPRINT ) LIBRARY MANAGEMENT SYSTEM   Table of Contents Serial No. Topic Name Content Page No. 1.   Introduction 1.1 Setup checklist for mini project 3     1.2 Instructions 3 2.   Problem statement   2.1 Objective 4     2.2 Abstract of the project 4     2.3 Functional components of the project 4     2.4 Technology used 5 3.   Implementation in RDBMS LOT 3.1 Guidelines on the functionality to be built 6 4.   Evaluation 4.1 Evaluation 7     1.      Introduction This document outlines a mini project for the RDBMS LOT

sample tables

  --sample tables DROP TABLE EMP; DROP TABLE DEPT; DROP TABLE BONUS; DROP TABLE SALGRADE; DROP TABLE DUMMY;   CREATE TABLE EMP        (EMPNO NUMBER(4) NOT NULL,         ENAME VARCHAR2(10),         JOB VARCHAR2(9),         MGR NUMBER(4),         HIREDATE DATE,         SAL NUMBER(7, 2),         COMM NUMBER(7, 2),         DEPTNO NUMBER(2));   INSERT INTO EMP VALUES         (7369, 'SMITH',   'CLERK',      7902,         TO_DATE('17-DEC-1980', 'DD-MON-YYYY'),   800, NULL, 20); INSERT INTO EMP VALUES         (7499, 'ALLEN',   'SALESMAN',   7698,         TO_DATE('20-FEB-1981', 'DD-MON-YYYY'), 1600,   300, 30); INSERT INTO EMP VALUES         (7521, 'WARD',    'SALESMAN',   7698,         TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1250,   500, 30); INSERT INTO EMP VALUES         (7566, 'JONES',   'MANAGER',    7839,         TO_DATE('2-APR-1981', 'DD-MON-YYYY'),   2975, NULL,