游标的使用及%type、%rowtype、function和procedure的一些用法和注意事项
(2015-03-31 14:26:28)
标签:
oraclesql |
分类: 数据库 |
一、1,显式游标:
显式游标的几个属性:
%found:测试fetch语句是否有值(数据),有值就返回true,否则为false;
%notfound:判断游标是否没有数据或有效,没有就true,有等于false.
%rowcount:返回游标的数据行数|返回当前位置为止游标读取的记录行数;
%isopen:是测试游标是否打开。如果没有打开游标就使用fetch语句就提示错误;
游标与存储过程和函数相似,可以将对参数传递给游标并在查询中使用,
cursor cursor_name(parameter_name in date_type...) is
select_statement
定义的参数语法如下:
parameter_name[in]data_type[(:|default)value]
注意:与存储过程不同的时,游标只能接受传递的值,而不能返回值。
参数是定义数据类型,没有大小。
使用for进行游标循环时,可以不显式地打开和关闭游标----for循环会自动执行这些操作。
while进行游标循环时,要注意给fetch的放置;
在使用for循环时,它的变量相当于一个记录型变量,里面存储着此游标所存放的变量!
=========================================================
2、变量:
1)使用%type
在pl/sql中可以将变量和常量声明为内建或用户定义的数据类型,以引用一个列名,同时继承他的数据类型和大小(用于获取列的类型,如果在声明变量的时候使用%type,变量会自动将变量类型设置为列的类型)
如: 有表prdtest
declare
v_moth
prdtest.month%type;
----保存prdtype表中moth列
v_prd_type prdtest.prd_type%type;-----保存prdtype表中prd_type列
v_sal
prdtest.sal%type;
----保存prdtype表中sal列
v_salers
prdtest.salers%type;
----保存prdtype表中salers列
或
v_velin number(5):=10;
v_hweilei v_velin%type:=15;
v_weile v_velin%type;
在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据。在这种情况下,变量应该拥有与表列相同的类型。例如,students表的first_name列的类型为VARCHAR2(20),我们可以按照下述方式声明一个变量:
DECLARE
v_FirstName VARCHAR2(20);
但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?那就会导致所有使用这个列的PL/SQL代码都必须进行修改。如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。
这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。
例如:
DECLARE
v_FirstName students.first_name%TYPE;
通过使用%TYPE,v_FirstName变量将同students表的first_name列的类型相同(可以理解为将两者邦定起来)。
每次匿名块或命名块运行该语句块以及编译存储对象(过程、函数、包、对象类和触发器)时,就会确定该类型。
使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
-------------------------------------------------------------------------------------------------------------------
2. 使用%ROWTYPE
2.1 PL/SQL记录
PL/SQL记录类型类似于C语言中的结构,是一种复合类型,是用户自定义的。
记录提供了一种处理独立的但又作为一个整体单元相关的变量的机制。请看:
DECLARE
v_StudentID NUMBER(5);
v_FirstName VARCHAR2(20);
v_LastName VARCHAR2(20);
这3个变量在逻辑上是相互关联的,因为他们指向students表中不同的字段。如果为这些变量声明一个记录类型,那么他们之间的关系就十分明显,可作为一个单元进行处理。
DECLARE
TYPE t_StudentRecord IS RECORD(
StudentID NUMBER(5),
FirstName VARCHAR2(20),
LastName VARCHAR2(20);
v_StudentInfo t_StudentRecord;
2.2 记录赋值
可以用SELECT语句向记录赋值,这将会从数据库中检索数据并将该数据存储到记录中。注意的是,记录中字段应该和查询结果列表中的字段相匹配。
SELECT studentID,firstName,lastName
into v_StudentInfo
from students where studentID=32;
2.3 使用%ROWTYPE
在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。
例如:
DECLARE
v_RoomRecord rooms%ROWTYPE;
将定义一个记录,该记录中的字段将与rooms表中的列相对应
例 :
Declare
v_rowtype v%Rowtype;
Begin
Select *
Into v_rowtype From v Where Id=2;---Declare
v_rowtype v%Rowtype;
Begin
Select *
Into v_rowtype From v Where Id=2/;----如果去掉where id=2
则要报错(这里因为%rowtype只能存储一行记录!)
Dbms_Output.put_line(':'||v_rowtype.id);
End;
Dbms_Output.put_line(':'||v_rowtype.id);
End;
%ROWTYPE
使用%ROWTYPE属性可以声明一个基于表或游标的行对象,也称为记录对象 ,如以下的例:
declare
v_rowtype
v%rowtype;
cursor v_test_cursor is
select * from v where id=1;
begin
open v_test_cursor;
loop
fetch v_test_cursor
into v_rowtype;
dbms_output.put_line('这是:' ||
v_rowtype.id);
exit when v_test_cursor%notfound;
end loop ;
end;
显式游标的几个属性:
游标与存储过程和函数相似,可以将对参数传递给游标并在查询中使用,
cursor cursor_name(parameter_name in date_type...) is
select_statement
定义的参数语法如下:
注意:与存储过程不同的时,游标只能接受传递的值,而不能返回值。
=========================================================
2、变量:
1)使用%type
declare
或
DECLARE
但是如果first_name列的定义改变了会发生什么(比如说表改变了,first_name现在的类型变为VARCHAR2(25))?那就会导致所有使用这个列的PL/SQL代码都必须进行修改。如果你有很多的PL/SQL代码,这种处理可能是十分耗时和容易出错的。
这时,你可以使用”%TYPE”属性而不是将变量类型硬性编码。
例如:
DECLARE
通过使用%TYPE,v_FirstName变量将同students表的first_name列的类型相同(可以理解为将两者邦定起来)。
每次匿名块或命名块运行该语句块以及编译存储对象(过程、函数、包、对象类和触发器)时,就会确定该类型。
使用%TYPE是非常好的编程风格,因为它使得PL/SQL更加灵活,更加适应于对数据库定义的更新。
-------------------------------------------------------------------------------------------------------------------
2. 使用%ROWTYPE
PL/SQL记录类型类似于C语言中的结构,是一种复合类型,是用户自定义的。
DECLARE
这3个变量在逻辑上是相互关联的,因为他们指向students表中不同的字段。如果为这些变量声明一个记录类型,那么他们之间的关系就十分明显,可作为一个单元进行处理。
DECLARE
2.2 记录赋值
SELECT studentID,firstName,lastName
into v_StudentInfo
from students where studentID=32;
2.3 使用%ROWTYPE
在PL/SQL中将一个记录声明为具有相同类型的数据库行的作法是很常见的。PL/SQL提供了%ROWTYPE运算符,使得这样的操作更为方便。
例如:
DECLARE
将定义一个记录,该记录中的字段将与rooms表中的列相对应
例 :
Declare
使用%ROWTYPE属性可以声明一个基于表或游标的行对象,也称为记录对象 ,如以下的例:
declare
begin