记录类型就是相当于数据库中表的行,记录提供了一种把这些值当做一组进行操作的方法。

1、PL/SQL中的记录。

   根据表创建记录的方式 :   var_name table_name%ROWTYPE,其中var_name变量名,table_name 表名。

      赋值:select * into var_name from table_name where ...

1)、使用记录的好处:

  数据抽象:记录抽象所代表的主体的不同属性或字段进行抽象化。

  操作集合:操作纪律,就相当于操作整块数据的操作。

2)、声明记录:

  a、基于表的记录类型:表名+%ROWTYPE。代表表的一行所有列的数据。

  b、基于游标的记录类型:对显示声明的游标或者游标变量+ROWTYPE的方式声明一个基于游标的记录类型。

    如:Declare

        Cursor my_books_cur Is Select *from books where ....

      one_SF_book my_books_cur%ROWTYPE.

  c、程序员自定义的记录类型:

  Type  .... Record语句定义记录类型,这种方式记录的每个字段都要在TYpe语句中明确的定义(包括字段名和数据类型);自定义记录类型中的字段甚至可以是另一个记录类型。

  如:Declare

    Type book_info_rt Is Record(

      author books.author%Type,---------字段类型是一个记录类型

      category varchar2(100),

      total_page_count positive);

  %ROWTYPE声明方式:record_name [schema_name.]object_name%ROWTYPE [DEFAULT |:= compatible _record]

  其中record_name 记录名称,schema_name 可选的,默认是代码编译时的所在的模式进行解析,object_name 可以是一个显式游标、游标变量、表、视图、或者同义词,Default是赋个初始值。

  另外一种隐式声明记录类型,常用在for循环中:

  For boor_rec in (select * from books)

  loop

  ..........

3)、程序员自定义的记录类型:

  a、声明自定义的记录类型:Type type_name Is Record

                (field_name1 datatype1[[not null]:=| DEfault default_value],

                 field_name2 datatype2[[not null]:=| DEfault default_value],

                  .....);

  程序员就可以按照自己的要求,把自己需要的字段类型添加到自定义的记录中,满足自己的需要,dateType类型,可以是很多种,可以是硬编码的,标量的数据类型(VARCHAR2,NUmber等),或者%TYPE|%ROWTYPE属性声明的锚类型,或者是一个列表或者集合,也或者是REF CURSOR游标变量类型。

  b、声明记录:record_name record_Type  record_name 记录名称,record_type 记录类型名称(通过TYpe...Record定义的)

  声明一个记录不需要%ROWTYPE或其他关键字,只有对表记录或者游标记录的时候才需要使用%ROWTYPE属性。

4)、使用记录类型:

  a、记录级别的操作:就是把一个记录当做一个整体进行操作,可以进行的操作有:

  • 相同的记录类型或者兼容的%ROWTYPE记录类型,可以进行拷贝。
  • 可以对一个记录类型进行Null赋值。
  • 可以把一个记录当做参数传递。
  • 函数接口可以返回记录类型。

  但是,有一些操作不可以在记录级别执行:

  • 不能用IS null方式判断一个记录里所有字段是否为null,必须对记录里每个字段进行单独判断。
  • 不能对两个记录进行比较,如果比较,就得针对记录里每个字段进行比较。

  b、字段级别的操作:

   访问一个记录字段的方式,就是访问表的字段方式一样:[[schame_name.]package_name.] record_name.field_name

  package_name 包的名称,记录所在的包,schame_name 包不属于代码编译所在的模式,还得提供模式名,record_name记录名称,field_name字段名称。

  操作字段级别的记录,和操作表的字段类似,不多讲了。

  注意:Oracle 9i R2 版本以后,支持把记录插入到表中,如:Insert into table (column1,column2) values table%ROWTYPE(或者一个和该表对应的记录)

  c、对嵌套记录的字段级别的操作: 就是记录类型中一个字段的类型也是一个记录类型。

  方式:rocord_name.record_name#.field_name,就是使用两个圆点表示法。如:contact_set.rectype.phone_rectype.area_code.

  d、对基于包的记录的字段级别操作:

  声明方式 :如 first_book summer.reading_list_rt,first_book记录名称,summer包名称,reading_list_rt包summer里的记录类型名称。

5)、记录的比较:

  必须对记录里每个字段进行比较,比较麻烦些,不过可以使用由Dan Spencer提供的“记录相等”生成器,生产记录比较的代码。

6)、触发器伪记录:

  触发器里,使用OLD表示记录前的数据,相当于SQLserver 触发器里的Deleted,NEW 代表更新后的记录,相当于SQLServer触发器里的New,OLD和NEW都是记录类型,在使用的时候,出来WHEN后面,其他情况都要在前面加上冒号,如: if (:NEW.Salary>200) .... when(new.salary!=old.salary)....

 

  

   

posted on 2013-07-04 09:32  Kelly_HanShuai  阅读(612)  评论(0)    收藏  举报