(メモ)基本複合型データタイプの声明


--(1)%typeで変数を定義する--
declare
n_name users.usedname%type;
begin
commit;
end;
 --(2)記録タイプ変数を定義する。
declare
--     myrecord     ,          myrecordnumber     mycurrentdate        
type myrecord is record(
 myrecordnumber int,
 mycurrentdate date);
  --      myrecord     ;
 srecord myrecord;
 begin
 select * into srecord from testtable where recordnumber=68;
 dbms_output.put_line(srecord.mycurrentdate);
 end; 
 --PL/SQLプログラムでは、select文はいつもintoと協力して使用されます。into子文の後には「割り当てられた変数」があります。
 
--(3)%rowtypeで変数を定義する――
declare
  --  
 mytable testtable%rowtype;
 begin 
 select * into mytable
 from testtable
 where recordnumber=88;
 dbms_output.put_line(mytable.currentdate);
 end; 
    --両者の定義の違いを比較します。変数名データテーブル。列名%type      //通常の変数を定義します。タイプと列が一致します。変数名データテーブル%rowtype        //複合型変数を定義します。タイプはテーブル構造と同じです。
 
--(4)一次元表型変数を定義する(高度な言語の一次元配列に相当する)
declare
type tabletype1 is table of varchar2(4) index by binary_integer;
type tabletype2 is table of testtable.recordnumber%type index by binary_integer;
table1 tabletype1;
table2 tabletype2;
begin
table1(1):='  ';
table1(2):='  ';
table2(1):=88;
table2(2):=55;
dbms_output.put_line(table1(1)||table2(1));
dbms_output.put_line(table1(2)||table2(2));
end;
 
 
--(5)多次元表型変数の定義(多次元配列に相当)
declare
type tabletype1 is table of users%rowtype index by binary_integer;
table1 tabletype1;
begin
select * into table1(20) from users where user_id=29;
dbms_output.put_line(table1(20).usedname||table1(20).real_name);
end;
 
 
--(6)多次元表タイプ変数を定義する。
declare
type tabletype1 is table of varchar2(20) index by binary_integer;
table1 tabletype1;
begin
table1(1):='  ';
table1(2):='  ';
table1(3):='  ';
dbms_output.put_line('   '||to_char(table1.count));
dbms_output.put_line('     '||table1.first);
dbms_output.put_line('      '||table1.last);
dbms_output.put_line('         '||table1.prior(2));
dbms_output.put_line('         '||table1.next(2));
if (table1.exists(2)) then dbms_output.put_line('       ');
else dbms_output.put_line('        ');
end if;
table1.delete(2);
dbms_output.put_line('==================');
dbms_output.put_line('   '||to_char(table1.count));
dbms_output.put_line('     '||table1.first);
dbms_output.put_line('      '||table1.last);
dbms_output.put_line('         '||table1.prior(2));
dbms_output.put_line('         '||table1.next(2));
if (table1.exists(2)) then dbms_output.put_line('       ');
else dbms_output.put_line('        ');
end if;
end;