PL/SQL基本結構---PLSQL複合型別---表型別變數table

pentium發表於2019-01-11

表型別變數table 
語法如下: 
     type 表型別  is table of  型別  index by binary_integer; 
     表變數名  表型別; 
型別可以是前面的型別定義,index by binary_integer 子句代表以符號整數為索引,這樣訪問表
型別變數中的資料方法就是“表變數名(索引符號整數)”。table型別,相當於java中的Map容器,
就是一個可變長的陣列,key(符號整數索引)必須是整數,可以是負數,value(型別)可以是
標量,也可以是record型別。可以不按順序賦值,但必須先賦值後使用。 
1. 定義一維表型別變數 
    ――――――――――――――――――――――――――――――――――――― 
    declare 
         type t_tb is table of varchar2(20) index by binary_integer; 
         v_tb t_tb; 
    begin 
       v_tb(100):='hello'; 
       v_tb(98):='world'; 
       dbms_output.put_line(v_tb(100)); 
       dbms_output.put_line(v_tb(98)); 
    end;     
    型別為record的表型別變數  
    declare 
         type t_rd is record(id number,name varchar2(20)); 
         type t_tb is table of t_rd index by binary_integer; 
         v_tb2 t_tb; 
    begin 
         v_tb2(100).id:=1; 
         v_tb2(100).name:='hello'; 
         --dbms_output.put_line(v_tb2(100).id); 
         --dbms_output.put_line(v_tb2(100).name); 
         dbms_output.put_line(v_tb2(100).id||'     '||v_tb2(100).name); 
    end; 
    ――――――――――――――――――――――――――――――――――――― 

2. 定義多維表型別變數 
該程式定義了名為tabletype1的多維表型別,相當於多維陣列,table1是多維表型別變數,將數
據表tempuser.testtable中recordnumber為60的記錄提取出來 
存放在table1中並顯示。 
    ――――――――――――――――――――――――――――――――――――― 
    declare 
       type tabletype1 is table of testtable%rowtype index by binary_integer; 
       table1 tabletype1; 
    begin 
        select * into table1(60) from tempuser.testtable where recordnumber=60; 
        dbms_output.put_line(table1(60).recordnumber||table1(60).currentdate); 
    end; 
    
   備註:在定義好的表型別變數裡,可以使用count、delete、first、last、next、exists和prior
等屬性進行操作,使用方法為“表變數名.屬性”,返回的是數字。 
     
    set serveroutput on 
    declare 
         type tabletype1 is table of varchar2(9) 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)); 
     end; 
     ――――――――――――――――――――――――――――――――――――― 
***************************************** 
      %type和%rowtype 
***************************************** 
使用%type定義變數,為了讓PL/SQL中變數的型別和資料表中的欄位的資料型別一致,Oracle 
9i提供了%type定義方法。這樣當資料表的欄位型別修改後,PL/SQL程式中相應變數的型別也
自動修改。 
     ――――――――――――――――――――――――――――――――――――― 
     create table student( 
        id number, 
        name varchar2(20), 
        age number(3,0) 
     ); 
     insert into student(id,name,age) values(1,'susu',23); 
     --查詢一個欄位的變數 
     declare 
        v_name varchar2(20); 
        v_name2 student.name%type; 
     begin 
        select name into v_name2 from student where rownum=1; 
        dbms_output.put_line(v_name2); 
     end; 
     --查詢多個欄位的變數 
     declare 
         v_id student.id%type; 
         v_name student.name%type; 
         v_age student.age%type; 
     begin 
       select id,name,age into v_id,v_name,v_age from student where rownum=1; 
       dbms_output.put_line(v_id||'   '||v_name||'   '||v_age); 
     end; 
     --查詢一個型別的變數,推薦用* 
     declare 
        v_student student%rowtype; 
     begin 
        select * into v_student from student where rownum=1; 
        dbms_output.put_line(v_student.id||'   '||v_student.name||'   '||v_student.age); 
     end; 
     --也可以按欄位查詢,但是欄位順序必須一樣,不推薦這樣做 
     declare 
        v_student student%rowtype; 
     begin 
      select id,name,age into v_student from student where rownum=1; 
      dbms_output.put_line(v_student.id||'   '||v_student.name||'   '||v_student.age); 
     end; 
     declare 
        v_student student%rowtype; 
     begin 
      select id,name,age into v_student.id,v_student.name,v_student.age from student where 
id=1; 
      --select * into v_student.id,v_student.name,v_student.age from student where id=1; 
      dbms_output.put_line(); 
     end; 
     ――――――――――――――――――――――――――――――――――――― 
    備註:insert,update,delete,select都可以,create table,drop table不行。DPL,DML,
和流程控制語句可以在pl/sql裡用,但DDL語句不行。 
     
     declare 
        v_name student.name%type:='wang'; 
     begin 
        insert into student(id,name,age) values(2,v_name,26); 
     end; 
     
     begin 
        insert into student(id,name,age) values(5,'hehe',25); 
     end; 
     declare 
        v_name student.name%type:='hexian'; 
     begin 
        update student set name=v_name where id=1; 
     end; 
     begin 
        update student set name='qinaide' where id=2; 
     end;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-2375490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章