zoukankan      html  css  js  c++  java
  • Records in PL/SQL

     

    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 ...

  • 相关阅读:
    友盟上报 IOS
    UTF8编码
    Hill加密算法
    Base64编码
    Logistic Regression 算法向量化实现及心得
    152. Maximum Product Subarray(中等, 神奇的 swap)
    216. Combination Sum III(medium, backtrack, 本类问题做的最快的一次)
    77. Combinations(medium, backtrack, 重要, 弄了1小时)
    47. Permutations II(medium, backtrack, 重要, 条件较难思考)
    3.5 find() 判断是否存在某元素
  • 原文地址:https://www.cnblogs.com/jimeper/p/1389528.html
Copyright © 2011-2022 走看看