属性¶
PLOSCAR的变量和游标都具有属性,它可以使用户很容易地引用现有的结构和数据类型,而不必重新定义。数据库中的表和列也有属性,它使得用户很容易维护程序中变量和数据库中字段的类型一致。
%TYPE和%ROWTYPE属性¶
使用%TYPE和%ROWTYPE属性,可以把变量声明为与另外一个数据库项相同的数据类型或结构(比如:一个表的域)。
%TYPE提供了一个变量或者数据库列的数据类型。用户可以用这个关键字声明那些需要保存数据库数值的变量。举例来说,假设系统中有一个名为id的列在用户表tab中。要声明一个和tab.id有相同数据类型的变量,如下
CREATE TABLE tab(id int);
INSERT INTO tab VALUES(1);
DECLARE
var1 tab.id%TYPE;
BEGIN
null;
END;
/
通过使用%TYPE,就不需要知道所引用结构的数据类型。更重要的是,如果被引用的数据类型在将来变化后(例如修改了tab表id列的数据类型),也可以保持函数定义不变。
在数据库名字前边,可以加名字空间做修饰,如下
DECLARE
var1 SYSDBA.tab.id%TYPE;
BEGIN
null;
END;
/
用%TYPE来提供一个变量的值的用法如下
DECLARE
var1 int;
var2 var1%TYPE;
BEGIN
null;
END;
/
这样,var2也会被声明为int类型。需要注意,record类型和rowtype不能用%TYPE方式声明。
%ROWTYPE的使用已在3.5.3中说明。
FOUND属性¶
对于游标的FETCH语句,如果想知道查询是否有结果,可以紧接着查询语句后判断FOUND属性的真假。如下
--清理环境
DROP PROCEDURE proc;
CREATE OR REPLACE PROCEDURE proc AS
DECLARE
CURSOR cursor1 is select id from tab;
record1 int;
BEGIN
OPEN cursor1;
FETCH cursor1 INTO record1;
IF FOUND THEN
dbms_output.put_line('查询有结果');
ELSE
dbms_output.put_line('查询没有结果');
END IF;
END;
/
EXEC proc;
--删除
DROP PROCEDURE proc;
当然也可以使用NOT FOUND属性来做相反的判断。