You are on page 1of 14

PL/SQL ORACLE

1
2
3
4

5
6
7

PL/SQL ........................................................................................ 1
............................................................................................. 2
........................................................................................... 5
3.1
PL/SQL ........................................................................ 5
........................................................................................................ 6
4.1
IF ................................................................................................. 6
4.2
(loops) ............................................................................ 7
- (Cursors)...................................................................................... 8
(Procedures) ..................................................................................... 10
(Triggers) ...................................................................................... 12

1 PL/SQL
PL/SQL (Procedural Language/SQL) SQL
(Pascal, PL/I).
SQL.
PL/SQL block. PL/SQL
blocks . block
. block :
DECLARE
/* Declarative section:
, .
*/
BEGIN
/* Executable section:
PL/SQL. */
. */
EXCEPTION
/* Exception handling section:
*/
END;
To executable. .
SQL PL/SQL :
SELECT, INSERT, UPDATE, DELETE
.
SELECT -
. PL/SQL (data
definition satements), CREATE, DROP ALTER. To executable section
, (if-statements),
(loops), trigger.
PL/SQL -.
C (/* ..... */).
PL/SQL SQL+
:
(".")
run;

PL/SQL sqlplus
(SQL>),
sqlplus.
SQL Developer, PL SQL RUN (F5).

2
, PL/SQL blocks. block
PL/SQL block
: ) block, ) Block , ) Block .

:
-
-
- Blocks
- .
PL/SQL

. NUMBER.
.
VARCHAR(n) n
bytes.
default . :
DECLARE
price NUMBER;
myBeer VARCHAR(20);
:
(Scalar)
o CHAR [(maximum_length)]
o VARCHAR2 (maximum_length)
o LONG
o LONG RAW
o NUMBER [(precision, scale)]
o BINARY_INTEGER

PLS_INTEGER
BOOLEAN
DATE: ( 4712 .. 9999 ..)
TIMESTAMP [(precision)]: DATE,

o TIMESTAMP [(precision)] WITH TIME ZONE


o TIMESTAMP [(precision)] WITH LOCAL TIME ZONE
o INTERVAL YEAR [(precision)] TO MONTH
o INTERVAL DAY [(precision)] TO SECOND
(Composite)
(Reference)
(LOB large objects): CLOB (text), BLOB (binary),
BFILE ( ), NCLOB (multibyte NCHAR unicode)
o
o
o
o

SQL PL/SQL .
SQL PL/SQL.
CHAR(50) . PL/SQL
BOOLEAN , Oracle BOOLEAN
.

identifier [CONSTANT] datatype [NOT NULL]
[:= DEFAULT expr];

DECLARE
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL := 10;
v_location VARCHAR2(13) := Atlanta;
c_comm CONSTANT NUMBER := 1400;

.
.
DECLARE
v_employee_id NUMBER(6);
BEGIN
SELECT employee_id
INTO v_employee_id
FROM employees
WHERE last_name = Kochhar;
END;
/
PL/SQL
.
.
,
. ,
%TYPE. :
DECLARE
3

myBeer Beers.name%TYPE;
PL/SQL myBeer name
Beers.
(record) (fields).
%ROWTYPE .

. :
DECLARE
beerTuple Beers%ROWTYPE;
beerTuple name
manufacture, Beers(name,
manufacture).
NULL .
, ":=".
,
. :
DECLARE
a NUMBER := 3;
BEGIN
a := a + 1;
END;
( SQL Developer SQL+,
:)
.
run;
,
a.
(bind variables)

PL/SQL.
: , VARIABLE
PRINT
VARIABLE g_salary NUMBER
BEGIN
SELECT salary
INTO :g_salary
FROM employees
WHERE employee_id = 178;
END;
/
PRINT g_salary

3
.
:
(delimiters)
+
*
/
=
@
;

<>
!=
||
-/*
*/
:=

(identifiers)
(literals)
v_name := Henderson;
(comments)
DECLARE
...
v_sal NUMBER (9,2);
BEGIN
/* Compute the annual salary based on the
monthly salary input from the user */
v_sal := :g_monthly_sal * 12;
END; -- This is the end of the block

3.1 PL/SQL
:

, SQL .
o SELECT SQL.
SELECT
INTO ,
.
(-).
SELECT -
.
-,
(cursors).

CREATE TABLE T1(


e INTEGER,
f INTEGER
);
DELETE FROM T1;
INSERT INTO T1 VALUES(1, 3);
INSERT INTO T1 VALUES(2, 4);

/* SQL.
PL/SQL.*/
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1;
INSERT INTO T1 VALUES(b,a);
END;
.
run;
SELECT (2, 4).
INSERT 1, (4, 2).

4

.

4.1 IF
IF <condition>
THEN <statement_list>
ELSE <statement_list>
END IF;
ELSIF. ELSE
.
IF <condition_1> THEN ...
ELSIF <condition_2> THEN ...
... ...
ELSIF <condition_n> THEN ...
ELSE ...
END IF;

, ,
1. 10
:
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1;
IF b=1 THEN
INSERT INTO T1 VALUES(b,a);
ELSE
INSERT INTO T1 VALUES(b+10,a+10);
6

END IF;
END;
.
run;

4.2 (loops)
. LoopExit WhenEnd Loop,
While Loop End Loop, For

LOOP
<loop_body> /* PL/SQL . */
END LOOP;
,
:
EXIT WHEN <condition>;
<condition> .
(1, 1) (100,
100) 1.
DECLARE
i NUMBER := 1;
BEGIN
LOOP
INSERT INTO T1 VALUES(i,i);
i := i+1;
EXIT WHEN i>100;
END LOOP;
END;
.
run;

PL/SQL :
1. loop, .
2. WHILE, :
WHILE <condition> LOOP
<loop_body>
ND LOOP;
3. FOR, :
FOR <var> IN <start>..<finish> LOOP
<loop_body>
END LOOP;
<var> .

. <start>
<finish> .

5 - (Cursors)
cursor -
. , .
- cursor,

-. (),
-.
cursor.
1(e, f), - .

1 :

1. DECLARE
/*
:*/
2.
3.

a T1.e%TYPE;
b T1.f%TYPE;

/* cursor: */
4.
CURSOR T1Cursor IS
5.
SELECT e, f
6.
FROM T1
7.
WHERE e < f
8.
FOR UPDATE;
9. BEGIN
10.
OPEN T1Cursor;
11.
LOOP
/* cursor PL/SQL
: */
12.

FETCH T1Cursor INTO a, b;

/* cursor
loop:*/
8

13.

EXIT WHEN T1Cursor%NOTFOUND;


/* : */

14.

DELETE FROM T1 WHERE CURRENT OF T1Cursor;


/* : */

15.
16.

INSERT INTO T1 VALUES(b, a);


END LOOP;
/* cursor.*/

17.
18.
19.
20.

CLOSE T1Cursor;
END;
.
run;

(1) .
(2) (3) a b
1(e, f).
1 INTEGER, a b
1.
(4) (8) cursor T1cursor. O
SELECT-FROM-WHERE,
,
. (8) cursor FOR UPDATE,
1 .
cursor - .
(9) .
(10) cursor
1 SELECT-FROM-WHERE.
(11) (16) PL/SQL loop,
LOOP END LOOP. loop :
1. FETCH, cursor
PL/SQL . FETCH
- cursor .
2. (13) loop.
, cursor %NOTFOUND,
- cursor.
3. (14) cursor
1. DELETE,
WHERE CURRENT OF T1Cursor.
4. (15) -
cursor.
H (17) cursor.
H (18) PL/SQL .

(19) (20) .

6 (Procedures)
PL/SQL
. addtuple1
i (i, xxx) 2 :
CREATE TABLE T2 (
a INTEGER,
b CHAR(10)
);
CREATE PROCEDURE addtuple1(i IN NUMBER) AS
BEGIN
INSERT INTO T2 VALUES(i, 'xxx');
END addtuple1;
.
run;
H CREATE PROCEDURE
.
mode
. modes ( ), OUT
( ), INOUT ( ).
.
CHAR(10) VARCHAR(20) .
CHAR VARCHAR .
AS ( S)
PL/SQL block.
END . block
DECLARE AS.
... AS
<local_var_declarations>
BEGIN
<procedure_body>
END;
.
run;
H run , .
PL/SQL block :
BEGIN addtuple1(99); END;
.
10

run;
2.
CREATE PROCEDURE addtuple2(
x T2.a%TYPE,
y T2.b%TYPE)
AS
BEGIN
INSERT INTO T2(a, b)
VALUES(x, y);
END addtuple2;
.
run;
(10, 'abc').
BEGIN
addtuple2(10, 'abc');
END;
.
run;
OUT :
CREATE TABLE T3 (
a INTEGER,
b INTEGER
);
CREATE PROCEDURE addtuple3(a NUMBER, b OUT NUMBER)
AS
BEGIN
b := 4;
INSERT INTO T3 VALUES(a, b);
END;
.
run;
DECLARE
v NUMBER;
BEGIN
addtuple3(10, v);
END;
.
run;
b
. v
b. v
4.

11

PL/SQL .

, RETURN :
CREATE FUNCTION <func_name>(<param_list>)
RETURN <return_type> AS ...
RETURN <expression>;
.

:
select object_type, object_name
from user_objects
where object_type = 'PROCEDURE'
or object_type = 'FUNCTION';
DROP.
drop procedure <procedure_name>;
drop function <function_name>;

7 (Triggers)
trigger PL/SQL procedures. ,
procedure block ,
trigger triggering event.
Triggering event INSERT, DELETE
UPDATE. timing BEFORE AFTER. To trigger
row-level statement-level,
triggering
.
trigger Oracle (
HELP CREATE TRIGGER
sqlplus)
CREATE [OR REPLACE] TRIGGER <trigger_name>
{BEFORE|AFTER} {INSERT|DELETE|UPDATE} ON
<table_name>
[FOR EACH ROW [WHEN (<trigger_condition>)]]
<trigger_body>

12

BEFORE AFTER triggers tables.


( INSTEAD OF triggers
)

triggering events
OR. UPDATE
OF
<table_name>. , OF event
OF.


... INSERT ON R ...
... INSERT OR DELETE OR UPDATE ON R ...
... UPDATE OF A, B OR INSERT ON R ...

FOR EACH ROW trigger row-level


statement-level.

row-level trigger, trigger


WHEN , . trigger
SQL Oracle
triggers.
. WHEN trigger
triggering event

<trigger_body> block PL/SQL statements SQL.


Oracle
<trigger_body>
trigger trigger

loop. <trigger_body>
o


trigger.


triggering

Oracle

CREATE TABLE T4 (a INTEGER, b CHAR(10));
CREATE TABLE T5 (c CHAR(10), d INTEGER);

13

trigger tuple T5 tuple


T4. trigger tuple
10 tuple 5.
CREATE TRIGGER trig1
AFTER INSERT ON T4
FOR EACH ROW
WHEN (NEW.a <= 10)
BEGIN
INSERT INTO T5 VALUES(:NEW.b, :NEW.a);
END trig1;
.
run;
NEW OLD tuples
. trigger NEW OLD
(:) WHEN.
CREATE TRIGGER . run
PL/SQL . CREATE
TRIGGER trigger . trigger event
4 , .
triggers
select trigger_name from user_triggers;
select trigger_type, table_name, triggering_event
from user_triggers
where trigger_name = '<trigger_name>';
trigger
drop trigger <trigger_name>;
trigger
alter trigger <trigger_name> {disable|enable};

14

You might also like