Oracle PL/SQL Nutshell

Oracle PL/SQL Nutshell

持續更新中。。。

Basic Syntax & Variables

Basic Structure

PL/SQL can be executed from SQL Plus

  • Called PL/SQL blocks
  • Anonymous blocks as they do not have a name
  • Procedures/functions are named blocks
[Declare]
BEGIN
[Exception]
END

Examples

VAR P_SET VARCHAR2(20)
BEGIN
    :P_SET := 'Hello world'; -- colon(:)variable_name, bind variable
END;
SET SERVEROUTPUT ON
BEGIN
    dbms_output.put_line('Hello world');
END;

Oracle Architecture

Variables

  • Used throughout PL/SQL
  • Holding area for data
  • Default values, constants
  • Values from the database
  • Populated with :=
VAR_NAME [CONSTANT] datatype [NOT NULL] [:= value]

Name conventions

prefix meaning
V_ standard variable
C_ constant
P_ variable that will be used/originated in SQL Plus
G_ variable used within multiple PL/SQL blocks

With prefix you can use preserved words

  • Declare variables in DECLARE section
  • := or SELECT INTO
  • Use all the SQL data types
  • Can use syntax %TYPE and %ROWTYPE to establish variables with database properties - type inheritance/runtime inheritance

Data types

Scalar types

Number
  • BINARY_DOUBLE
  • BINARY_FLOAT
  • BINARY_INTEGER
  • DEC
  • DECIMAL
  • DOUBLE PRECISION
  • FLOAT
  • INT
  • INTEGER
  • NATURAL
  • NATURALN
  • NUMBER
  • NUMERIC
  • PLS_INTEGER
  • POSITIVE
  • POSITIVEN
  • REAL
  • JSONTYPE
  • SMALLINT
Characters
  • CHAR
  • CHARACTER
  • LONG
  • LONG RAW
  • NVARCHAR2
  • RAW
  • ROWO
  • STRING
  • UROWO
  • VARCHAR
  • VARCHAR2
Boolean
  • BOOLEAN
Date
  • DATE
  • DATETIME

Composite types

  • RECORD
  • TABLE
  • VARRAY

Reference types

  • REF CURSOR
  • REF object_type

LOB types

  • BFILE
  • BLOB
  • CLOB
  • NCLOB

Variable scope

  • Can nest PL/SQL blocks - blocks within blocks
  • Inner blocks can see outer blocks variables
  • Outer blocks cannot see inner block variables
DECLARE
V_V1 NUMBER;
BEGIN
V_V1 := 1;
    DECLARE
    V_V2 NUMBER;
    BEGIN
    V_V1 := V_V2;
    END;
DBMS_OUTPUT...
END;

Create type

DECLARE
TYPE emp_info IS RECORD (
    v_ename emp.ename%TYPE,
    v_sal emp.sal%TYPE
);
emp_rec emp_info;
emp_rec2 emp%ROWTYPE;

Control Flow

Logic Flow

IF…ELSIF…ELSE

IF <condition> THEN
    <statements>;
ELSIF <condition> THEN
    <statements>;
ELSE
    <statements>;
END IF;

CASE WHEN

CASE
    WHEN <condition> THEN
        <statements>;
    WHEN <condition> THEN
        <statements>;
    ELSE
        <statements>
END;

LOOP

LOOP

LOOP
    <statements>;
    EXIT LOOP WHEN <condition>;
END LOOP;

WHILE

WHILE <condition> THEN
    <statements>;
END;

FOR LOOP

FOR <var_> IN var_
LOOP
    <statements>;
END LOOP;

CURSOR

DECLARE
    CURSOR c1 IS
        SELECT prod_id,cust_id, time_id, amount_sold
        FROM sales
        WHERE amount_sold > 100;
    c1_rec c1%ROWTYPE;
    l_cust_firstname customers.cust_firstname%TYPE;
    l_cust_lastname customers.cust_lastname%TYPE;
BEGIN
    FOR c1_rec IN c1
    LOOP
        ...
    END LOOP;
END;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章