1. 程式人生 > >Oracle12C--索引表(三十二)

Oracle12C--索引表(三十二)

知識點的梳理:
  • 索引表不存在遍歷操作!
  • 由於索引表的索引號是非固定的,使用者可以通過"索引表物件.EXISTS()"函式進行驗證
    • EXISTS()函式屬於集合函式;
  • 它是啥?
    • 索引表類似陣列,可以儲存多個數據,通過下標訪問每一個數據;
    • 索引表與陣列的區別:
      • 索引表的下標,可以用整數或字串來定義;
      • 使用數字作為索引下標,可以設定為負數;
      • 索引表不需要初始化,可以直接為指定索引賦值,開闢的索引表的索引不一定必須連續;
  • 使用方式
    • 語法:

TYPE 型別名稱 IS TABLE OF 資料型別 [NOT NULL]
INDEX BY [PLS_INTEGER | BINARY_INTEGER | VARCHAR2(長度

)];

  • 示例1定義索引表

DECLARE

TYPE info_index IS TABLE OF VARCHAR(20)

INDEX BY PLS_INTEGER ;

v_info info_index ;

BEGIN

v_info (1) := 'bing' ;

v_info (10) := 'JAVA' ;

DBMS_OUTPUT.put_line(v_info(1)) ;

DBMS_OUTPUT.put_line(v_info(10)) ;

END ;

/

執行結果:

bing

JAVA

注意:使用索引表中不存在的索引號時,會出現:"ORA-01403:未找到任何資料"的異常

  • 示例2使用EXISTS()函式,來驗證索引

DECLARE

TYPE info_index IS TABLE OF VARCHAR(20)

INDEX BY PLS_INTEGER ;

v_info info_index ;

BEGIN

v_info (1) := 'bing' ;

v_info (10) := 'JAVA' ;

IF v_info.EXISTS(10) THEN

DBMS_OUTPUT.put_line(v_info(1)) ;

END IF ;

IF v_info.EXISTS(30) THEN

DBMS_OUTPUT.put_line(v_info(30)) ;

ELSE

DBMS_OUTPUT.put_line('索引號為30的資料不存在!') ;

END IF ;

END ;

/

執行結果:

bing

索引號為30的資料不存在!
分析:
通過這種方式,可以避免"
ORA-01403:未找到任何資料"異常的出現

  • 示例3:定義索引表,使用VARCHAR2作為下標索引

DECLARE

TYPE info_index IS TABLE OF VARCHAR(50)

INDEX BY VARCHAR2(30) ;

v_info info_index ;

BEGIN

v_info ('公司名稱') := 'Oraclebing' ;

v_info ('培訓專案') := 'JAVA-Android高階培訓' ;

DBMS_OUTPUT.put_line(v_info('公司名稱')) ;

DBMS_OUTPUT.put_line(v_info('培訓專案')) ;

END ;

/

執行結果:

Oracle(bing)

JAVA-Android高階培訓

分析:
使用
VARCHAR2作為索引下標型別時,需要為其設定一個大小(INDEX BY VARCHAR2(30)

,而後所設定的索引下標長度應該在此範圍之內

  • 示例4:定義ROWTYPE型的索引表

DECLARE

TYPE dept_index IS TABLE OF dept%ROWTYPE

INDEX BY PLS_INTEGER ;

v_dept dept_index ;

BEGIN

v_dept(0).deptno := 80 ;

v_dept(0).dname := 'Oracle' ;

v_dept(0).loc := '北京' ;

IF v_dept.EXISTS(0) THEN

DBMS_OUTPUT.put_line('部門編號:' || v_dept(0).deptno || ',名稱:' || v_dept(0).dname || ',位置:' || v_dept(0).loc) ;

END IF ;

END ;

/

執行結果:
部門編號:80,名稱:Oracle,位置:北京