数据库对象 PLSQL 块结构

一、概述:
       1
PLSQL 块结构:
       DECLARE ---
可选
        
变量声明定义
       BEGIN  ----
必选
        SQL
PLSQL 语句
       EXCEPTION ----
可选
      
错误处理
       END
---- 必选

变量声明
DECLARE
owner char(10);
tablename char(30);
bytes number(10);
fiscal_year number(2) := '97';
today date

.赋值:
a.使用“:=”赋值;
b.使用“select into” 或 “fetch into”赋值;
c.使用“&str”从键盘输入赋值;


指针定义
指针型变量则指向了查询结果中的某一行数据.
DECLARE
cursor employee_cursor is
select * from employees;
指针与视图类似通过在PROCDURE 部分使用LOOP 循环你可以翻阅指针.

 

 

%TYPE 属性
%TYPE 可以返回表中给定列的变量属性除了查看在PL/SQL 中的数据类型定义代码
你可以使用%TYPE 来保持在你的块中的代码的一致性.
DECLARE
cursor employee_cursor is
select emp_id, emp_name from employees;
id_num employees.emp_id%TYPE;
name employees.emp_name%TYPE;
%TYPE 所定义的变量NAME 具有与EMPLOYEES 中的emp_name 具有相同的数据类型.

 

%ROWTYPE 属性
变量不仅限于单一的数值如果你所定义的变量与一个指针相关联的话你可以使用
%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 的行
数.


%NOTFOUND 是指针的一种属性它表明在当前指针中没有任何数据;
上一个例子中将一个指针所指的行的数据赋给了一个名字叫employee_record 的变量
它使用LOOP 循环来移动指针.

取得特定的变量:
DECLARE
cursor employee_cursor is
select emp_id, emp_name from employees;
id_num employees.emp_id%TYPE;
name employees.emp_name%TYPE;
BEGIN
open employee_cursor;
loop

EXIT WHEN employee_cursor%NOTFOUND;
fetch employee_cursor into id_num, name;
end loop;
close employee_cursor;
END
分析
在这个例子中是把当前的指针所指的行的对应数据填入变量id_num 和name 中这两
个变量是在DECLARE 部分中定义的.
CLOSE
使用CLOSE 命令来关闭指针.
close employee_cursor;
分析
当关闭一个指针以后查询的结果集就不复存在了如果你想访问结果集中的数据你
必须重新打开指针才行.


条件语句
IF .....THEN
IF condition1 THEN
statement1;
END IF;
或:
IF condition1 THEN
statement1
ELSIF condition2 THEN
statement2
ELSE
statement3
END IF

 

 

LOOPS 循环
LOOPS 在PL/SQL 的语句块中将不断地执行过程直到指定的条件满足为止.
例如在循环中翻阅指针的时候你可以指定当指针处于最后一行
的时候退出循环见下例:
BEGIN
open employee_cursor
LOOP
FETCH employee_cursor into employee_record
EXIT WHEN employee_cursor%NOTFOUND;
statement1
END LOOP
close employee_cursor
END;

 

WHILE-LOOP 则是在当条定条件满足时执行特定的语句而当条件不在满足时就会从
循环中退出转而执行下一条语句.
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;
分析
在上一个例子中使用了WHILE-LOOP 来对指针进行翻阅并且在当条件
payment<total_due 为真时一直进行循环

在上一个例子中你也可以使用FOR-LOOP 来限定当前的指针所指定的行的数值处于已
给定的数值内.
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;
分析
在这个例子中使用了FOR-LOOP 翻阅指针它是默认的FETCH 下执行该语句被省
略了而且在这里%NOTFOUND 属性也被省略了该属性在FOR-LOOP 循环中也是默认
的所以这个例子与上一个例子的结果将是相同的.

 

 

激活EXCEPTION (异常)
在语句块中的异常可以由RAISE 语句来激活异常可以由程序员进行准确地激活然
而当数据库产生内部错误时它会被自动激活或由默认的数据库服务来调用.
BEGIN
DECLARE
exception_name EXCEPTION;
BEGIN
IF condition THEN
RAISE exception_name;
END IF;
EXCEPTION
WHEN exception_name THEN
Statement;
END;
END;
分析
这个例子给出了对异常进行准确激活的基本方法首先exception_name 要在
EXCEPTION 语句中进行了定义在PROCEDURE 部分当给定的条件满足时这个异常就
由RAISE 语句激活了然后RAISE 语句将会引用EXCEPTION 语句中的对应异常部分以
进行适当的工作.

异常的处理
在上例中捕获了在EXCEPTION 部分中的一个异常在PL/SQL 中错误是非常容易捕
获的在进行了异常处理以后PL/SQL 可以在错误状态下继续运行或是以下种合理的方
式来终止.
EXCEPTION
WHEN exception1 THEN
statement1;
WHEN exception2 THEN
statement2;
WHEN OTHERS THEN
statement3;
分析
这个例子告诉了你当你有多于一个的异常时应该如何在EXCEPTION 部分中进行安
排在这个例子中的块在运行时有两个预料中的异常exception1 和exception2 如果在
该语句中产生了其他的异常就会调用WHEN OTHERS 它对你的语句块中的其它的错误进
行了处理.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值