ORACLE PL/SQL

(1).PL/SQL对大小写不是敏感的。

(2).字符类型:

CHAR:最大程度32767。

(3).快格式:

BEGIN

DECLARE

BEGIN

EXCEPTION

END

END

注:要是用了第一个BENGIN就一定要用第二个,反之亦然。

(4)注释方法:

单行--This is a one-line comment

多行/*This is

is a

one-line comment

*/

(5)PL/SQL可以直接支持DML语言查询,却不支持DDL命令,你通常会使用PL/SQL维护在数据库结构中的数据。但并不能维护这些结构。

(6)DECLARE

customer char(30);

fiscal_year number(2) NOT NULL:='97';

每一个变量的定义都必须以分号结束。

(7)声明指针

DECLARE

cursor employee_cursor is

select * from employees;

指针与视图类似,通过在PROCDURE部分使用LOOP(循环)。你可以翻阅指针。

(8)%TYPE属性

%TYPE可以放回表中给定的变量属性。

DECLARE

cursor employee_cursor is

select emp_id, emp_name from employees;

id_num employees.emp_id%TYPE;

name employees.emp_name%TYPE;

(9)%ROWTYPE 属性

变量不仅限于单一的数值,如果你所定义的变量与一个指针相关联的话,你可以使用

%ROWTYPE 属性来声明变量与保证它与游标所在行的类型相同.在ORACLE 的词典中

%ROWTYPE

DECLARE

cursor employee_cursor is

select emp_id, emp_name from employees;

employee_record employee_cursor%ROWTYPE;

分析:

在上例中定义了一个叫employee_record 的变量,%ROWTYPE 定义了这个变量的使它

与employee_cursor 所在行的数据类型相同这个%ROWTYPE 属性定义的变量也称为集合

变量.

%ROWCOUNT 属性

在PL/SQL 中%ROWCOUNT 属性可以保证在特定的SQL 语句块中的游标行数

DECLARE

cursor employee_cursor is

select emp_id, emp_name from employees;

records_processed := employee_cursor%ROWCOUNT;

在上例中变量records_processed 将会返回PL/SQL 语句所访问的employee_cursor 的行

警告:在定义变量的时候要小心以访止它和表的名字相冲突,例如:如果你定义的变量与

你的PL/SQL 语句块中所访问的表的名字是相同的,那么变量的名字会优先于表的名字

Procdure 部分

PROCDURE 部分是一个块的主要部分,它包括条件语句和SQL

语句

BEGIN

open a cursor;

condition1;

statement1;

condition2;

statement2;

condition3;

statement3;

...

close the cursor;

END

指针控制命令

现在你将学习如何在PL/SQL 的语句块中定义一个指针你需要知道如何来访问一个

定义过的指针这一部分诠释了基本的指针控制命令DECLARE OPEN FETCH 和

CLOSE

条件语句

IF condition1 THEN

statement1;

END IF;

IF condition1 THEN

statement1;

ELSE

statement2;

END IF;

IF condition1 THEN

statement1;

ELSIF condition2 THEN

statement2;

ELSE

statement3;

END IF;

LOOPS 循环

LOOP

WHILE-LOOP

FOR-LOOP

BEGIN

open employee_cursor;

LOOP

FETCH employee_cursor into employee_record;

EXIT WHEN employee_cursor%NOTFOUND;

statement1;

....

END LOOP;

close employee_cursor;

END;

DECLARE

cursor payment_cursor is

select cust_id, payment, total_due from payment_table;

cust_id payment_table.cust_id%TYPE;

payment payment_table.payment%TYPE;

total_due payment_table.total_due%TYPE;

BEGIN

open payment_cursor;

WHILE payment < total_due LOOP

FETCH payment_cursor into cust_id, payment, total_due;

EXIT WHEN payment_cursor%NOTFOUND;

insert into underpay_table

values (cust_id, 'STILL OWES');

END LOOP;

close payment_cursor;

DECLARE

cursor payment_cursor is

select cust_id, payment, total_due from payment_table;

cust_id payment_table.cust_id%TYPE;

payment payment_table.payment%TYPE

total_due payment_table.total_due%TYPE;

BEGIN

open payment_cursor;

FOR pay_rec IN payment_cursor LOOP

IF pay_rec.payment < pay_rec.total_due THEN

insert into underpay_table

values (pay_rec.cust_id, 'STILL OWES');

END IF;

END LOOP;

close payment_cursor;

END;

EXCEPTION 部分

激活EXCEPTION (异常):RIASE

BEGIN

DECLARE

exception_name EXCEPTION;

BEGIN

IF condition THEN

RAISE exception_name;

END IF;

EXCEPTION

WHEN exception_name THEN

Statement;

END;

END;

异常的处理

EXCEPTION

WHEN exception1 THEN

statement1;

WHEN exception2 THEN

statement2;

WHEN OTHERS THEN

statement3;

SQL*PLUS