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