属性

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属性来做相反的判断。