Oracle PL/SQL Tutorial/Collections/Table of Record

Материал из SQL эксперт
Перейти к: навигация, поиск

An anonymous PL/SQL procedure to demonstrate the use of PL/SQL records

SQL>
SQL> create table employee (
  2  id                             number                         not null,
  3  employee_type_id               number                         not null,
  4  external_id                    varchar2(30)                   not null,
  5  first_name                     varchar2(30)                   not null,
  6  middle_name                    varchar2(30),
  7  last_name                      varchar2(30)                   not null,
  8  name                           varchar2(100)                  not null,
  9  birth_date                     date                           not null,
 10  gender_id                      number                         not null );
Table created.
SQL>
SQL> declare
  2      TYPE name_record is record (
  3      first_name                            employee.first_name%TYPE,
  4      middle_name                           employee.middle_name%TYPE,
  5      last_name                             employee.last_name%TYPE );
  6      TYPE name_table is table of name_record index by binary_integer;
  7      t_name                                name_table;
  8  begin
  9   t_name(1).first_name  := "JOHN";
 10   t_name(1).last_name   := "DOE";
 11   t_name(2).first_name  := "JANE";
 12   t_name(2).last_name   := "DOE";
 13
 14   dbms_output.put_line(t_name(1).last_name||", "||t_name(1).first_name);
 15   dbms_output.put_line(t_name(2).last_name||", "||t_name(2).first_name);
 16  end;
 17  /
DOE, JOHN
DOE, JANE
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table employee;
Table dropped.
SQL>


Bulk DML with table of records

SQL>
SQL>
SQL> CREATE TABLE customer_region(
  2     region_id    NUMBER(4)    PRIMARY KEY,
  3     region_name  VARCHAR2(11) NOT NULL
  4  );
Table created.
SQL>
SQL>
SQL> INSERT INTO customer_region VALUES (1,"REGION1");
1 row created.
SQL> INSERT INTO customer_region VALUES (2,"REGION2");
1 row created.
SQL> INSERT INTO customer_region VALUES (3,"REGION3");
1 row created.
SQL> INSERT INTO customer_region VALUES (4,"REGION4");
1 row created.
SQL>
SQL>
SQL>
SQL> DECLARE
  2    Type regionRecord IS Record(region_id NUMBER(4),region_name VARCHAR2(10));
  3    Type region_tbl IS TABLE of regionRecord INDEX BY BINARY_INTEGER;
  4    regionRecords region_tbl;
  5    returnCode NUMBER;
  6    Ret_errorMessage VARCHAR2(1000);
  7    Procedure load_regions (regionRecords IN region_tbl,
  8           returnCode OUT NUMBER,
  9           errorMessage OUT VARCHAR2)
 10    Is
 11    BEGIN
 12
 13      DELETE FROM customer_region;
 14
 15      FOR i in regionRecords.FIRST..regionRecords.LAST LOOP
 16        INSERT INTO customer_region
 17        values (regionRecords(i).region_id,regionRecords(i).region_name);
 18      END LOOP;
 19
 20      COMMIT;
 21
 22    EXCEPTION WHEN OTHERS THEN
 23
 24      returnCode :=SQLCODE;
 25
 26      errorMessage :=SQLERRM;
 27
 28    END;
 29  BEGIN
 30    FOR i IN 1..5 LOOP
 31      regionRecords(i).region_id :=i;
 32      regionRecords(i).region_name :="REGION"||i;
 33    END LOOP;
 34    Load_regions(regionRecords,returnCode,ret_errorMessage);
 35  EXCEPTION WHEN OTHERS THEN
 36    RAISE_APPLICATION_ERROR(-20111,SQLERRM);
 37  END;
 38  /
PL/SQL procedure successfully completed.
SQL>
SQL>
SQL> drop table customer_region;
Table dropped.
SQL>
SQL>


Defining an Index-by table of records

SQL> DECLARE
  2    TYPE hrc_company_rec IS RECORD
  3      (hrc_company_id NUMBER,
  4       product_description VARCHAR2(20),
  5       company_short_name VARCHAR2(30));
  6
  7    TYPE hrc_company IS TABLE OF hrc_company_rec INDEX BY BINARY_INTEGER;
  8
  9    v_example_tab hrc_company;
 10  BEGIN
 11    /*Do some processing */
 12    null;
 13  END;
 14  /
PL/SQL procedure successfully completed.


Table collection of records

SQL>
SQL> CREATE OR REPLACE PACKAGE process_vacations IS
  2     TYPE pv_vacation_rec IS RECORD
  3        (pv_vacationing_user_txt    VARCHAR2(30),
  4         pv_start_date              VARCHAR2(10),
  5         pv_end_date                VARCHAR2(10),
  6         pv_redirect_interviews_txt VARCHAR2(30),
  7         pv_redirect_reviews_txt    VARCHAR2(30));
  8     TYPE pv_type_vacation_tab IS TABLE OF pv_vacation_rec
  9        INDEX BY BINARY_INTEGER;
 10     PROCEDURE process_schedules (p_vac_tab IN pv_type_vacation_tab);
 11  END process_vacations;
 12  /
Package created.
SQL>
SQL>
SQL> CREATE OR REPLACE PACKAGE BODY process_vacations IS
  2
  3      PROCEDURE process_schedules (p_vac_tab IN pv_type_vacation_tab) IS
  4      BEGIN
  5         FOR lv_loop_counter_num IN 1..p_vac_tab.COUNT LOOP
  6            NULL;
  7         END LOOP;
  8      END process_schedules;
  9  END process_vacations;
 10  /
Package body created.
SQL>