Oracle PL/SQL Tutorial/Collections/Table of Record
Содержание
An anonymous PL/SQL procedure to demonstrate the use of PL/SQL records
<source lang="sql">
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></source>
Bulk DML with table of records
<source lang="sql">
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></source>
Defining an Index-by table of records
<source lang="sql">
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.</source>
Table collection of records
<source lang="sql">
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></source>