您的位置:首页 > 数据库

Records in PL/SQL

2009-02-12 23:32 239 查看
Records in PL/SQL

1.Declaring Records

Table-based record

DECLARE one_book books%ROWTYPE;

Cursor-based record

DECLARE CURSOR my_books_cur IS

SELECT * FROM books

WHERE author LIKE '%FEUERSTEIN%';

one_SF_book my_books_cur%ROWTYPE;

以上两种方法都使用了 %ROWTYPE 属性,语法为:

record_name [schema_name.]object_name%ROWTYPE

[ DEFAULT|:= compatible_record ];

schema_name 是可选的,默认为编译该代码的 schema

object_name 可以是 explicit cursor, cursor variable, table, view, or synonym

可以指定一个默认值,默认值必须是和 record 相同或者兼容的类型

使用 cursor variable 的例子:

DECLARE TYPE book_rc IS REF CURSOR RETURN books%ROWTYPE;

book_cv book_rc;

one_book book_cv%ROWTYPE;

BEGIN

...

Programmer-defined record

DECLARE TYPE book_info_rt IS RECORD (

author books.author%TYPE,

category VARCHAR2(100),

total_page_count POSITIVE);

steven_as_author book_info_rt;

隐式声明 record

BEGIN

FOR book_rec IN (SELECT * FROM books)

LOOP

calculate_total_sales (book_rec);

END LOOP;

END;

其中 book_rec 就是 PL/SQL 用 %ROWTYPE 隐式声明的

2.Programmer-Defined Records

声明步骤:

1.声明或者定义一个 record TYPE 包含你需要的结构

2.使用这个 record TYPE 声明你需要的实际 records

Declaring programmer-defined record TYPEs

TYPE type_name IS RECORD

(field_name1 datatype1,

field_name2 datatype2,

...

field_nameN datatypeN

);

field_name 必须是唯一的

datatype 可以为:

1.Hardcoded, scalar datatype (VARCHAR2, NUMBER, etc.).

2.Programmer-defined SUBTYPE

3.Anchored declarations using %TYPE or %ROWTYPE attributes.

4.PL/SQL collection type

5.REF CURSOR(cursor variable)

除了 datatype 还可以用 DEFAULT or := 指定默认值;还可以使用约束,比如 NOT NULL(使用 NOT NULL 必须要指定默认值)

Declaring the record

一旦声明了 record types,就可以用它声明任何该类型的 records:

record_name record_type;

3.Working with Records

Record-level operations PL/SQL 支持的:

1.两个 record 之间复制内容(只要两者结构兼容,比如:相同的 fields 数量,相同或者兼容的数据类型)

2.将 NULL 赋值给 record

3.可以在参数中定义 record,或将 record 传递给参数

4.可以作为 function 的返回值

不支持的:

1.不能对 record 使用 IS NULL 来判断每个 fields 都为空,而应该分别判断每个 field 是否 IS NULL

2.不能直接比较两个 record,比如是否相等或者不相等、是否一个比另一个大,只能一个个 field 单独比较

3.在 9i R2 之前,不能将 record 插入表中,只能将每个 field 单独插入相应的 column 中

Field-level operations

访问 field 的语法:

[schema_name.][package_name.]record_name.field_name

如果 record 定义在包中,那么 schema_name 是包所属的 schema,而不是编译该代码所使用的 schema

4.Trigger Pseudo-Records

在写 trigger 时,Oracle 提供了两个 pseudo-records,他们的结构和使用 %ROWTYPE 声明的 table-based records 一样:

OLD 表示当前事务完成前,表中每列的值

NEW 表示当前事务完成后,表中每列的值

在使用他们时在前面要加上冒号,在 WHEN clause 里面使用不需要加:

CREATE OR REPLACE TRIGGER check_raise

AFTER UPDATE OF salary

ON employee

FOR EACH ROW

WHEN (OLD.salary != NEW.salary) OR

(OLD.salary IS NULL AND NEW.salary IS NOT NULL) OR

(OLD.salary IS NOT NULL AND NEW.salary IS NULL)

BEGIN

IF :NEW.salary > 100000 THEN ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: