(Notes) (Subject Notes) Informatics Practices (PL/SQL )
Disclaimer: This website is NOT associated with CBSE, for official website of CBSE visit - www.cbse.gov.in
(Subject Notes) Informatics Practices
PL/SQL
PL/SQL = Procedural Language extensions to
SQL
An Oracle-specific language combining features of:
- 
    
modern, block-structured programming language
 - 
    
database interaction via SQL
 
Designed to overcome declarative SQL's inability to specify control aspects of DB interaction.
Used to add procedural capabilities to Oracle tools.
PL/SQL is implemented via a PL/SQL engine (cf. JVM)
- 
    
which can be embedded in clients (e.g. Forms, SQL*Plus)
 - 
    
which is also usually available in the Oracle server
 
Why PL/SQL?
Consider trying to implement the following in SQL (SQL*Plus):
If a user attempts to withdraw more funds than they have from their account, then indicate "Insufficient Funds", otherwise update the account
A possible implementation:
ACCEPT person PROMPT 'Name of account holder: '
ACCEPT amount PROMPT 'How much to withdraw: 'UPDATE Accounts
SET balance = balance - &amount
WHERE holder = '&person' AND balance > &amount;
SELECT 'Insufficient Funds'
FROM Accounts
WHERE holder = '&person' AND balance < = &amount;
Two problems:
- 
    
doesn't express the "business logic" nicely
 - 
    
performs both actions when (balance-amount < amount)
 
We could fix the second problem by reversing the order (SELECT then UPDATE).
But in SQL there's no way to avoid executing both the SELECT and the UPDATE
PL/SQL allows us to specify the control more
naturally:
-- A sample PL/SQL procedure
PROCEDURE withdrawal(person IN varchar(20),
amount IN REAL ) IS
     current REAL;
BEGIN
     SELECT balance INTO current
     FROM Accounts
     WHERE holder = person;
     IF (amount > current)
          dbms_output.put_line('Insufficient
Funds');
     ELSE
          UPDATE Accounts
          SET balance =
balance - amount
          WHERE holder =
person AND balance > amount;
          COMMIT;
     END IF;
END;
And package it up into a useful function, which could be used as:
SQL> EXECUTE withdrawal('John Shepherd', 100.00);
PL/SQL Syntax
PL/SQL is block-structured, where a block consists of:
DECLARE
     declarations for
          constants, variables
and local procedures
BEGIN
     procedural and SQL statements
EXCEPTION
     exception handlers
END;
Data Types
PL/SQL constants and variables can be defined using:
- 
    
standard SQL data types (CHAR, DATE, NUMBER, ...)
 - 
    
built-in PL/SQL types (BOOLEAN, BINARY_INTEGER)
 - 
    
PL/SQL structured types (RECORD, TABLE)
 
Users can also define new data types in
terms of these.
There is also a CURSOR type for interacting with SQL.
Record Types
Corresponding to Modula RECORDs or Constructs, and also closely related to SQL table row type.
New record types can be defined via:
     TYPE TypeName IS RECORD
          (Field1 Type1,
Field2 Type2, ...);
Example:
     TYPE Student IS RECORD (
          id# NUMBER(6),
          name VARCHAR(20),
          course NUMBER(4)
     );
Record components are accessed via Var.Field notation.
     fred Student;
     ...
     fred.id# := 123456;
     fred.name := 'Fred';
     fred.course := 3978;
Record types can be nested.
     TYPE Day IS RECORD
          (day NUMBER(2),
month NUMBER(2), year NUMBER(4));
     TYPE
Person IS RECORD
          (name VARCHAR(20),
phone VARCHAR(10), birthday Day);
Constants and Variables
Variables and constants are declared by
specifying:
     Name [ CONSTANT ] Type [ := Expr ] ;
Examples:
     amount INTEGER;
     part_number NUMBER(4);
     in_stock BOOLEAN;
     owner_name VARCHAR(20);
     max_credit CONSTANT REAL := 5000.00;
     my_credit REAL := 2000.00;
Variables can also be defined in terms of:
- 
    
the type of an existing variable or table column
 - 
    
the type of an existing table row (implict RECORD type)
 
Examples:
     employee
Employees%ROWTYPE;
     name Employees.name%TYPE;
Assigning Values to Variables
A standard assignment operator is available:
    tax := price * tax_rate;
    amount := TO_NUMBER(SUBSTR('750 dollars',1,3));
Values can also be assigned via
SELECT...INTO:
     SELECT price +10 INTO cost
    FROM StockList
    WHERE item = 'Cricket Bat';
    total := total + cost;
SELECT...INTO can assign a whole row at
once:
     DECLARE
          emp
Employees%ROWTYPE;
          my_name VARCHAR(20);
          pay NUMBER(8,2);
     BEGIN
          SELECT * INTO emp
          FROM Employees
          WHERE id# = 966543;
          my_name := emp.name;
...
          SELECT name,salary
INTO my_name,pay
          FROM Employees
          WHERE id# = 966543;
     END;
Control Structures
PL/SQL has conventional set of control structures:
- 
    
for sequence (note:- ; is a terminator)
 - 
    
IF for selection
 - 
    
FOR, WHILE, LOOP for repetition
 
Along with exceptions to interrupt normal
control flow.
And a NULL; statement to do nothing.
Selection
Selection is expressed via:
- 
    
IF Cond1 THEN Statements1;
 - 
    
ELSIF Cond2 THEN Statements2;
 - 
    
ELSIF Cond3 THEN Statements3;
 
Example:
| If A > B Then Dbms_output.put_line (‘A is big’); End if;  | 
      If A > B Then Dbms_output.put_line (‘A is big’); ELSIF Dbms_output.put_line (‘B is big’); End if;  | 
    
| If A
        > B Then Dbms_output.put_line (‘A is big’); ELSE Dbms_output.put_line (‘B is big’); End if;  | 
    
Courtesy : Cbseguess.com