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
:=
orSELECT 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;