友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第50部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
%ROWTYPE
INPUT
DECLARE
cursor employee_cursor is
select emp_id; emp_name from employees;
employee_record employee_cursor%ROWTYPE
分析
在上例中定义了一个叫 employee_record 的变量 %ROWTYPE 定义了这个变量的使它
与 employee_cursor 所在行的数据类型相同 这个%ROWTYPE 属性定义的变量也称为集合
变量
384
…………………………………………………………Page 385……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
%ROWCOUNT 属性
在 PL/SQL 中%ROWCOUNT 属性可以保证在特定的 SQL 语句块中的游标行数
INPUT
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 部分是 PL/SQL 语句块中的必须部分 在这一部分将会使用变量和用户指
针来操作数据库中的数据 PROCDURE 部分是一个块的主要部分 它包括条件语句和 SQL
语句
BEGIN END
在一个语句块中 BEGIN 标明了一个过程的开始 与此类似 END 则标明了一个语
句块的结束 下边的例子显示了一个 PROCDURE 部分的基本结构
语法
BEGIN
open a cursor;
condition1
statement1
condition2
statement2
385
…………………………………………………………Page 386……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
condition3
statement3
close the cursor
END
指针控制命令
现在你将学习如何在 PL/SQL 的语句块中定义一个指针 你需要知道如何来访问一个
定义过的指针 这一部分诠释了基本的指针控制命令 DECLARE OPEN FETCH 和
CLOSE
DECLARE
在今天的早些时候你已经学习了如何在 DELCARE 部分定义一个指针 DECLARE 语
句包括下列指针控制命令
OPEN
现在你已经定义了一个指针 但是你应该如何去使用它呢 如果你不使用打开这本书
你无法看到它的内容的 同样 如果你不使用 OPEN 命令来打开一个指针你也将无法使用
它 例如
语法
BEGIN
open employee_cursor;
statement1;
statement2;
。
END
386
…………………………………………………………Page 387……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
FETCH
FETCH 可以从一个指针中取得变量的值 这里有两个使用 FETCH 的例子 一个是取
得一个集合变量 另外了个则取得特定的变量
INPUT
DECLARE
cursor employee_cursor is
select emp_id; emp_name from employees;
employee_record employee_cursor%ROWTYPE;
BEGIN
open employee_cursor;
loop
fetch employee_cursor into employee_record;
end loop;
close employee_cursor;
END
分析
上一个例子中将一个指针所指的行的数据赋给了一个名字叫 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
fetch employee_cursor into id_num; name;
end loop;
close employee_cursor;
387
…………………………………………………………Page 388……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
END
分析
在这个例子中是把当前的指针所指的行的对应数据填入变量 id_num 和 name 中 这两
个变量是在 DECLARE 部分中定义的
CLOSE
如果你已经在一个块中结束了对指针的使用时 你应该将这个指针关闭 与你通常在
读完一本书以后要将书合上一样 你应该使用 CLOSE 命令来关闭指针
语法
BEGIN
open employee_cursor;
statement1;
statement2;
。
。 close employee_cursor;
END
分析
当关闭一个指针以后 查询的结果集就不复存在了 如果你想访问结果集中的数据你
必须重新打开指针才行
条件语句
现在我们得到了非常有用的东西来控制我们的 SQL 语句的运行 在 PL/SQL 中的条件
语句与大多数第三代编程语言是类似的
IF THEN
在大多数编程中 IF THEN 语句可能是得常用的语句了 它决定了对于特定的条件
应当执行哪一部分的操作 其结构如下
语法
388
…………………………………………………………Page 389……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
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
分析
在最后一个例子中 如果满足条件 1 那么就执行语句 1 如果满足条件 2 那么就会
执行语句 2 否则的话就会执行语句 3 条件语句也可以嵌于其他语句和 LOOP 循环中
LOOPS 循环
LOOPS 在 PL/SQL 的语句块中将不断地执行过程直到指定的条件满足为止 一共有三
种循环
LOOP 本身是一个无限的循环 它经常在指针中使用 如果你想终止这种循环 你必
须指定在什么时候退出 例如 在循环中翻阅指针的时候你可以指定当指针处于最后一行
的时候退出循环 见下例
389
…………………………………………………………Page 390……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
输入
BEGIN
open employee_cursor
LOOP
FETCH employee_cursor into employee_record
EXIT WHEN employee_cursor%NOTFOUND
statement1
END LOOP
close employee_cursor
END
%NOTFOUND 是指针的一种属性 它表明在当前指针中没有任何数据 在上一个例
子中如果指针没有发现数据就会退出循环 假如你在循环中忽略了这条语句 循环将会一
直进行下去
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')
390
…………………………………………………………Page 391……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
END LOOP
close payment_cursor
分析
在上一个例子中使用了 WHILE…LOOP 来对指针进行翻阅 并且在当条件
payment start proc1 or
SQL》 sta proc1 or
SQL》 @proc1
注 PL/SQL 脚本语言可以使用 START 命令或@字符来运行 它也可以被其它的 PL/SQL
脚本 SHELL 脚本或其它的程序调用
将输入返回给用户
尤其是在捕获了错误的时候 你可以会希望输出信息给用户告诉他出现了什么错误
你可以转送已有的错误信息 你也可以显示你所定制的错误信息 对于用户来说这会与错
误代码更容易理解 也许你想的是当在错误产生时让他们与数据库管理员联系而不是给他
们尽可以准确的信息
PL/SQL 在它的语法部分中并没有提供直接的方式来显示输出 但是它可以让你来调
用一个对该语句块服务的包 这个包是由 DBMS_OUTPUT 来调用的
EXCEPTION
WHEN zero_divide THEN
DBMS_OUTPUT。put_line('ERROR: DIVISOR IS ZERO。 SEE YOUR DBA。')
分析
ZERO_DIVIDE 是 ORACLE 的一个预定义的异常 有许多在程序运行中产生的常见的
错误都被预定义为异常并且可以被默认地激活 也就是说你不必在编程的过程中手动将其
激活
39
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!