PL/SQL - 记录

  • 简述

    在本章中,我们将讨论 PL/SQL 中的记录。record是一种数据结构,可以容纳不同类型的数据项。记录由不同的字段组成,类似于数据库表的一行。
    例如,您想跟踪图书馆中的书籍。您可能希望跟踪每本书的以下属性,例如标题、作者、主题、书籍 ID。包含每个项目的字段的记录允许将 BOOK 视为一个逻辑单元,并允许您以更好的方式组织和表示其信息。
    PL/SQL 可以处理以下类型的记录 -
    • 基于表格
    • 基于游标的记录
    • 用户定义的记录
  • 基于表的记录

    %ROWTYPE 属性使程序员能够创建 table-basedcursorbased 记录。
    下面的例子说明了 table-based记录。我们将使用我们在前几章中创建和使用的 CUSTOMERS 表 -
    
    DECLARE 
       customer_rec customers%rowtype; 
    BEGIN 
       SELECT * into customer_rec 
       FROM customers 
       WHERE id = 5;  
       dbms_output.put_line('Customer ID: ' || customer_rec.id); 
       dbms_output.put_line('Customer Name: ' || customer_rec.name); 
       dbms_output.put_line('Customer Address: ' || customer_rec.address); 
       dbms_output.put_line('Customer Salary: ' || customer_rec.salary); 
    END; 
    /
    
    在 SQL 提示符下执行上述代码时,会产生以下结果 -
    
    Customer ID: 5 
    Customer Name: Hardik 
    Customer Address: Bhopal 
    Customer Salary: 9000 
     
    PL/SQL procedure successfully completed.
    
  • 基于光标的记录

    下面的例子说明了 cursor-based记录。我们将使用我们在前几章中创建和使用的 CUSTOMERS 表 -
    
    DECLARE 
       CURSOR customer_cur is 
          SELECT id, name, address  
          FROM customers; 
       customer_rec customer_cur%rowtype; 
    BEGIN 
       OPEN customer_cur; 
       LOOP 
          FETCH customer_cur into customer_rec; 
          EXIT WHEN customer_cur%notfound; 
          DBMS_OUTPUT.put_line(customer_rec.id || ' ' || customer_rec.name); 
       END LOOP; 
    END; 
    /
    
    在 SQL 提示符下执行上述代码时,会产生以下结果 -
    
    1 Ramesh 
    2 Khilan 
    3 kaushik 
    4 Chaitali 
    5 Hardik 
    6 Komal  
    PL/SQL procedure successfully completed. 
    
  • 用户定义的记录

    PL/SQL 提供了用户定义的记录类型,允许您定义不同的记录结构。这些记录由不同的字段组成。假设您想跟踪图书馆中的书籍。您可能想要跟踪每本书的以下属性 -
    • 标题
    • 作者
    • 主题
    • 图书编号

    定义记录

    记录类型定义为 -
    
    TYPE 
    type_name IS RECORD 
      ( field_name1  datatype1  [NOT NULL]  [:= DEFAULT EXPRESSION], 
       field_name2   datatype2   [NOT NULL]  [:= DEFAULT EXPRESSION], 
       ... 
       field_nameN  datatypeN  [NOT NULL]  [:= DEFAULT EXPRESSION); 
    record-name  type_name;
    
    Book 记录以下列方式声明 -
    
    DECLARE 
    TYPE books IS RECORD 
    (title  varchar(50), 
       author  varchar(50), 
       subject varchar(100), 
       book_id   number); 
    book1 books; 
    book2 books; 
    

    访问字段

    要访问记录的任何字段,我们使用点 (.)操作员。成员访问运算符被编码为记录变量名称和我们希望访问的字段之间的句点。以下是解释记录用法的示例 -
    
    DECLARE 
       type books is record 
          (title varchar(50), 
          author varchar(50), 
          subject varchar(100), 
          book_id number); 
       book1 books; 
       book2 books; 
    BEGIN 
       -- Book 1 specification 
       book1.title  := 'C Programming'; 
       book1.author := 'Nuha Moo ';  
       book1.subject := 'C Programming Tutorial'; 
       book1.book_id := 6495407;  
       -- Book 2 specification 
       book2.title := 'Telecom Billing'; 
       book2.author := 'Alex Moo'; 
       book2.subject := 'Telecom Billing Tutorial'; 
       book2.book_id := 6495700;  
      
      -- Print book 1 record 
       dbms_output.put_line('Book 1 title : '|| book1.title); 
       dbms_output.put_line('Book 1 author : '|| book1.author); 
       dbms_output.put_line('Book 1 subject : '|| book1.subject); 
       dbms_output.put_line('Book 1 book_id : ' || book1.book_id); 
       
       -- Print book 2 record 
       dbms_output.put_line('Book 2 title : '|| book2.title); 
       dbms_output.put_line('Book 2 author : '|| book2.author); 
       dbms_output.put_line('Book 2 subject : '|| book2.subject); 
       dbms_output.put_line('Book 2 book_id : '|| book2.book_id); 
    END; 
    /
    
    在 SQL 提示符下执行上述代码时,会产生以下结果 -
    
    Book 1 title : C Programming 
    Book 1 author : Nuha Moo 
    Book 1 subject : C Programming Tutorial 
    Book 1 book_id : 6495407 
    Book 2 title : Telecom Billing 
    Book 2 author : Alex Moo 
    Book 2 subject : Telecom Billing Tutorial 
    Book 2 book_id : 6495700  
    PL/SQL procedure successfully completed. 
    

    记录为子程序参数

    您可以像传递任何其他变量一样将记录作为子程序参数传递。您还可以按照在上面的示例中访问的相同方式访问记录字段 -
    
    DECLARE 
       type books is record 
          (title  varchar(50), 
          author  varchar(50), 
          subject varchar(100), 
          book_id   number); 
       book1 books; 
       book2 books;  
    PROCEDURE printbook (book books) IS 
    BEGIN 
       dbms_output.put_line ('Book  title :  ' || book.title); 
       dbms_output.put_line('Book  author : ' || book.author); 
       dbms_output.put_line( 'Book  subject : ' || book.subject); 
       dbms_output.put_line( 'Book book_id : ' || book.book_id); 
    END; 
       
    BEGIN 
       -- Book 1 specification 
       book1.title  := 'C Programming'; 
       book1.author := 'Nuha Moo ';  
       book1.subject := 'C Programming Tutorial'; 
       book1.book_id := 6495407;
       
       -- Book 2 specification 
       book2.title := 'Telecom Billing'; 
       book2.author := 'Alex Moo'; 
       book2.subject := 'Telecom Billing Tutorial'; 
       book2.book_id := 6495700;  
       
       -- Use procedure to print book info 
       printbook(book1); 
       printbook(book2); 
    END; 
    /  
    
    在 SQL 提示符下执行上述代码时,会产生以下结果 -
    
    Book  title : C Programming 
    Book  author : Nuha Moo 
    Book subject : C Programming Tutorial 
    Book  book_id : 6495407 
    Book title : Telecom Billing 
    Book author : Alex Moo 
    Book subject : Telecom Billing Tutorial 
    Book book_id : 6495700  
    PL/SQL procedure successfully completed.