*****************************************
PLSQL游标和goto语句
*****************************************
备注:下面提到的游标为静态cursor,包括显示和隐式。
游标,从declare、open、fetch、close是一个完整的生命旅程。当然了一个这样的游标是可以被多次open进行使用的,显式cursor是静态cursor,他的作用域是全局的,但也必须明白,静态cursor也只有pl/sql代码才可以使用它。静态游标变量是在定义时就必须指定SQL语句。
cursor 游标(结果集)用于提取多行数据,定义后不会有数据,使用后才有。一旦游标被打开,就无法再次打开(可以先关闭,再打开)。
declare
cursor c_student is select * from book;
begin
open c_student;
close c_student;
end;
第二种游标的定义方式,用变量控制结果集的数量。
declare
v_id binary_integer;
cursor c_student is select * from book where id>v_id;
begin
v_id:=10;
open c_student;
close c_student;
end;
第三种游标的定义方式,带参数的游标,用的最多。
declare
cursor c_student(v_id binary_integer) is select * from book where id>v_id;
begin
open c_student(10);
close c_student;
end;
游标的使用,一定别忘了关游标。
declare
v_student book%rowtype;
cursor c_student(v_id binary_integer) is select * from book where id>v_id;
begin
open c_student(10);
fetch c_student into v_student;
close c_student;
dbms_output.put_line(v_student.name);
end;
如何遍历游标fetch
游标的属性 %found,%notfound,%isopen,%rowcount。
%found,若前面的fetch语句返回一行数据,则%found返回true,如果对未打开的游标使用则报ORA-1001异常。
%notfound,与%found行为相反。
%isopen,判断游标是否打开。
%rowcount,当前游标的指针位移量,到目前位置游标所检索的数据行的个数,若未打开就引用,返回ORA-1001。
注:
no_data_found和%notfound的用法是有区别的,小结如下
1)SELECT…INTO 语句触发 no_data_found;
2)当一个显式光标(静态和动态)的where子句未找到时触发%notfound;
3)当UPDATE或DELETE 语句的where子句未找到时触发sql%notfound;
4)在光标的提取(Fetch)循环中要用%notfound或%found来确定循环的退出条件,不要用no_data_found。
下面是几个实例:
create table BOOK
(
ID VARCHAR2(10) not null,
BOOKNAME VARCHAR2(10) not null,
PRICE VARCHAR2(10) not null,
CID VARCHAR2(10) not null
);
--insert
create or replace procedure say_hello(i_name in varchar2,o_result_msg out varchar2)
as
v_price varchar2(100);
e_myException exception;
begin
insert into book(id,bookname,price) values (1,2,3);
o_result_msg := 'success';
exception
when others then
rollback;
o_result_msg := substr(sqlerrm, 1, 200);
end;
--update or delete
create or replace procedure say_hello(i_name in varchar2,o_result_msg out varchar2)
as
v_price varchar2(100);
e_myException exception;
begin
update book set price = '55' where bookname = i_name;
delete from book where bookname = i_name;
if sql%notfound then
raise e_myException;
end if;
/*
if sql%rowcount = 0 then--写法2
raise e_myException;
end if;
*/
o_result_msg := 'success';
exception
when e_myException then
rollback;
o_result_msg := 'update or delete dail';
end;
--select
create or replace procedure say_hello(i_name in varchar2,o_result_msg out varchar2)
as
v_price varchar2(100);
e_myException exception;
begin
select price into v_price from book where bookname = i_name;
o_result_msg := 'success';
exception
when no_data_found then
rollback;
o_result_msg := 'select into dail';
end;
loop方式遍历游标
declare
v_bookname varchar2(100);
cursor c_book(i_id number) is select bookname from book where id = i_id;
begin
Open c_book(10);
Loop
Fetch c_book into v_bookname;
exit when c_book%notfound;
update book set price = '33' where bookname = v_bookname;
End Loop;
Close c_book;
end;
或
declare
v_bookname varchar2(100);
cursor c_book(i_id number) is select bookname from book where id = i_id;
begin
Open c_book(10);
Fetch c_book into v_bookname;
While c_book%found Loop
update book set price = '33' where bookname = v_bookname;
Fetch c_book into v_bookname;
End Loop;
Close c_book;
end;
while循环遍历游标,注意,第一次游标刚打开就fetch,%found为null,进不去循环,解决方法:while nvl(c_book%found,true) loop
declare
v_bookname varchar2(100);
cursor c_book(i_id number) is select bookname from book where id = i_id;
begin
Open c_book(10);
while nvl(c_book%found,true) loop
--或这种写法:while c_book%found is null or c_book%found loop
Fetch c_book into v_bookname;
update book set price = '33' where bookname = v_bookname;
End Loop;
Close c_book;
end;
for循环遍历,最简单,用的最多,不需要声明v_bookname,Open和Close游标和fetch操作(不用打开游标和关闭游标,实现遍历游标最高效方式)
declare
cursor c_book(i_id number) is select bookname from book where id = i_id;
begin
for cur in c_book(10) loop
update book set price = '53' where bookname = cur.bookname;
end loop;
end;
goto例子,一般不推荐使用goto,会使程序结构变乱
declare
i number:=0;
begin
if i=0 then
goto hello;
end if;
<<hello>>
begin
dbms_output.put_line('hello');
goto over;
end;
<<world>>
begin
dbms_output.put_line('world');
goto over;
end;
<<over>>
dbms_output.put_line('over');
end;
转载自:http://www.blogjava.net/cheneyfree/archive/2008/07/19/216090.html
相关推荐
通过"qlsql4.pdf"和"qlsql5.pdf"这两个文件,你可以深入学习PL/SQL的具体语法和实例,进一步提升你的Oracle数据库开发能力。记得结合实际操作来理解和掌握这些概念,实践是检验理论的最好方式。
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个编程语言,它结合了SQL的查询功能和传统的过程式编程语言的特点,主要用于数据库应用开发。本资料《PLSQL开发初步》主要介绍...
PLSQL中的控制结构包括条件语句(IF-THEN-ELSIF-ELSE)、循环语句(WHILE、FOR、LOOP)、分支语句(CASE)以及流程控制语句(GOTO)。这些结构使得程序可以根据不同的条件执行不同的逻辑,实现复杂的业务规则。 ...
1. **PLSQL基础**:了解PLSQL的基本语法,包括变量声明、常量定义、条件语句(如IF-ELSE)、循环结构(如WHILE和FOR)、异常处理(如BEGIN-EXCEPTION-END)以及控制流程语句(如GOTO)。 2. **块的概念**:PLSQL由...
PLSQL的执行部分包含SQL语句(如INSERT、UPDATE、DELETE、SELECT等)和PLSQL语句(如赋值、条件语句IF-THEN-ELSIF-ELSE、循环FOR、WHILE、GOTO等)。例如,我们可以通过BEGIN...END块来组织代码,通过EXECUTE ...
3. **流程控制语句**:PLSQL提供了一系列的流程控制结构,如IF-THEN-ELSIF-ELSE(条件语句)、CASE(选择结构)、FOR循环(遍历集合)、WHILE循环(条件循环)和GOTO(无条件跳转)。 4. **块结构**:PLSQL程序由块...
PLSQL(Procedural Language/Structured Query Language)是Oracle数据库中的一个强大编程工具,它将SQL语句与过程式编程语言结合在一起,为数据库管理提供了更丰富的功能。本主题“PLSQL高级编程-结构化编程”主要...
##### 示例4:使用%TYPE和%ROWTYPE ```plsql DECLARE v_sname VARCHAR2(50); v_employee EMPLOYEES%ROWTYPE; -- 使用%ROWTYPE获取EMPLOYEES表中一行的所有字段 BEGIN SELECT sname INTO v_sname FROM salary ...
4. **PLSQL的流程控制**:包括IF-THEN-ELSIF-ELSE语句、CASE语句、FOR循环、WHILE循环、GOTO跳转等,用于根据不同的条件执行不同的代码块。 5. **PLSQL的存储过程与函数**:存储过程是一组为了完成特定功能的SQL...
PLSQL(Procedural Language/Structured Query Language)是Oracle数据库中的一个强大编程语言,它将SQL语句与过程式编程语言结合在一起,为数据库管理、数据处理和应用程序开发提供了丰富的功能。本篇将深入探讨...
这篇“学习Oracle必备手册”——PLSQL程序设计,旨在帮助初学者快速掌握PLSQL的基础知识和应用技巧。 PLSQL是一种结合了SQL和过程编程语言的特性,它允许开发者创建复杂的数据库应用程序。以下是你在阅读这本手册时...
在这个“PLSQL_2”主题中,我们可以深入探讨PLSQL的一些核心概念和重要特性,以及如何利用它来增强数据库管理与开发。 1. **PLSQL的基本结构**: PLSQL程序由三部分组成:声明部分、执行部分和异常处理部分。声明...
3. **流程控制语句**:包括条件语句(IF-THEN-ELSIF-ELSE)、循环语句(WHILE, FOR, GOTO)和CASE表达式,用于控制程序的执行流程。 4. **集合操作**:PLSQL中的集合包括数组、索引表(Index-By Table)和关联数组...
- **分支语句**:GOTO用于无条件跳转到程序中的另一位置,但通常不推荐使用,因为可能造成代码难以理解和维护。 3. **函数与过程**: - **函数**:返回一个值的PLSQL子程序,可以被其他PLSQL代码或SQL查询调用。 ...
**PLSQL学习笔记** PL/SQL(Procedural Language/Structured Query ...本笔记中的"PLSQL笔记.doc"文件可能包含了更详尽的示例和练习,可以帮助你进一步巩固这些概念。建议结合实际数据库环境进行实践,以加深理解。
PL/SQL(Procedural Language/Structured Query Language)结合了SQL的查询功能和过程性编程语言的特性,使得数据库管理和开发更加高效。本书“Oracle9i PLSQL 入门到精通”旨在帮助读者从基础开始,逐步掌握这一...
4. 子程序:包括函数(Function)和过程(Procedure),它们是一组PLSQL语句的集合,可以封装常用的操作,提高代码复用性。子程序可以有输入参数和输出参数,甚至可以返回值。 5. 游标(Cursor):游标允许PLSQL...
PLSQL可以直接调用SQL语句进行数据查询、插入、更新和删除操作,还可以通过游标处理复杂的查询结果。此外,PLSQL还可以创建存储过程、触发器、索引、同义词等数据库对象,实现数据库的高级管理。 九、PLSQL的性能...
PLSQL提供了丰富的流程控制结构,如IF-THEN-ELSIF-ELSE、CASE语句用于条件判断,WHILE和FOR循环用于迭代,以及GOTO和EXIT语句进行程序跳转。掌握这些结构能帮助编写复杂的逻辑流程。 四、集合与记录 PLSQL支持数组...
在本压缩包"PLSQL程序结构.rar"中,包含了一系列关于PLSQL的重要知识点,如语法、视图、异常处理、游标、存储过程、包、块以及函数等,这些都是数据库开发和管理中的核心概念。 首先,让我们详细探讨PLSQL的语法。...