PL/SQLの記録表データタイプ


レコードテーブル(またはインデックステーブル)のデータタイプは、記録タイプに似ています。記録タイプに対する拡張です。記録タイプは単一データしか処理できないので、拡張テーブルタイプの処理が可能です。
複数の記録は、二次元配列と類似しており、データベース内の表を模倣することができる。
レコードテーブルの種類の定義文法:
--          
TYPE table_name IS TABLE OF element_type [not null]
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2];

--    INDEX BY           ,              。
テーブルを作成し、データを挿入します。
create table mytest(    
    id number(3),    
    name varchar2(20),    
    age number(3)    
);    
insert into mytest values(1,'one',18);    
insert into mytest values(2,'two',20);    
insert into mytest values(3,'three',24);    
commit;
インスタンスの使用:
DECLARE
  --       
  TYPE mytest_table_type IS TABLE OF mytest%ROWTYPE
  INDEX BY BINARY_INTEGER;
  --      
  v_table_type mytest_table_type;
  --      
  v_count number(2) := 3;
BEGIN
  --    id           ,  int      ,     
  FOR int IN 1..v_count LOOP
      SELECT * INTO v_table_type(int) FROM mytest WHERE id = int;
  END LOOP;
  --           ,    id       ,             
  FOR int IN v_table_type.FIRST .. v_table_type.LAST LOOP
      DBMS_OUTPUT.PUT_LINE('  :'||v_table_type(int).name);
      DBMS_OUTPUT.PUT_LINE('  :'|| v_table_type(int).age);
      DBMS_OUTPUT.PUT_LINE('-------------------------------');
  END LOOP;
END;
出力結果:
氏名:one年齢:18------------------氏名:two年齢:20------------------------------氏名:three年齢:24-----------------------
一次元配列形式は記録タイプを使用します。
DECLARE
  --       
  TYPE my_table_type IS TABLE OF varchar2(50)
  INDEX BY BINARY_INTEGER;
  --    
  v_my_table my_table_type;
BEGIN
  --       
  v_my_table(1) := 'one';
  v_my_table(2) := 'two';
  v_my_table(3) := 'three';
  v_my_table(4) := 'four';
  --           
  DBMS_OUTPUT.PUT_LINE(v_my_table(1));
  DBMS_OUTPUT.PUT_LINE(v_my_table(2));
  DBMS_OUTPUT.PUT_LINE(v_my_table(3));
  DBMS_OUTPUT.PUT_LINE(v_my_table(4));
END;
出力結果:
one two three four
二次元配列形式は記録タイプを使用します。
DECLARE
  --       
  TYPE my_table_type IS TABLE OF mytest%ROWTYPE
  INDEX BY BINARY_INTEGER;
  --    
  v_my_table my_table_type;
BEGIN
  --       
  SELECT name,age INTO v_my_table(1).name,v_my_table(1).age FROM mytest WHERE id = 1;
  SELECT name,age INTO v_my_table(2).name,v_my_table(2).age FROM mytest WHERE id = 2;
  SELECT name,age INTO v_my_table(3).name,v_my_table(3).age FROM mytest WHERE id = 3;
  --           
  DBMS_OUTPUT.PUT_LINE(v_my_table(1).name||' '||v_my_table(1).age);
  DBMS_OUTPUT.PUT_LINE(v_my_table(2).name||' '||v_my_table(2).age);
  DBMS_OUTPUT.PUT_LINE(v_my_table(3).name||' '||v_my_table(3).age);
END;
出力結果:
one 18 two 20 th ree 24