天天看點

Oracle Record & Table Type (行與表對象類型用法)

對于自定義類型,通常也會分為兩類,一類是子類型,一類是普通類型。

子類型

這種類型最簡單,類似類型的一個别名,主要是為了對常用的一些類型簡單化,它基于原始的某個類型,如:number(16,2)。

子類型實作定義的全局化:subtype gn_num is number(16,2);

普通類型

普通類型的定義很多,這裡主要對Record & Table兩種類型做一些入門講解。

Record類型

首先,需要建立一個簡單的Record類型:

TYPE gr_test_rec IS RECORD(
    test_id   NUMBER,
    test_name VARCHAR2(10));--全局類型
           

它的使用也很簡單,隻需在具體方法中使用這個全局類型去定義字段就好了,如下:

  PROCEDURE test_pro(x_out_str OUT VARCHAR2) IS
    lr_test_rec gr_test_rec;
  BEGIN
    --初始化類型
    lr_test_rec.test_id   := 1;
    lr_test_rec.test_name := 'Test';
  
    --使用類型值
    BEGIN
      SELECT lr_test_rec.test_id || '-' || lr_test_rec.test_name
        INTO x_out_str
        FROM dual
       WHERE 1 = 1;
    EXCEPTION
      WHEN OTHERS THEN
        x_out_str := NULL;
    END;
  END;
           

清空類型資料

lr_test_rec := null;
           

Table類型

這裡建立的Table類型與上面說的内容相關聯,就是利用Record類型來建立。

TYPE gt_test_rec_tbl IS TABLE OF gr_test_rec INDEX BY BINARY_INTEGER;--全局類型
           

用法:

  PROCEDURE test_pro(x_out_str OUT VARCHAR2) IS
    lr_test_rec     gr_test_rec;
    lt_test_rec_tbl gt_test_rec_tbl;
  BEGIN
  
    --初始化類型
    lr_test_rec.test_id   := 1;
    lr_test_rec.test_name := 'Test';
  
    --指派
    lt_test_rec_tbl(1) := lr_test_rec;
  
    --Table類型使用
    FOR i IN 1 .. lt_test_rec_tbl.count LOOP
      x_out_str := lt_test_rec_tbl(i).test_id || '-' || lt_test_rec_tbl(i).test_name;
      EXIT;
    END LOOP;
  
    --清空資料
    lt_test_rec_tbl.delete;
  END;
           

補充

通過對象建立Table

首先建立一個對象類型

CREATE OR REPLACE TYPE type_obj AS OBJECT(id NUMBER, obj_name VARCHAR2(8));
           

然後建立一張表

create table obj_table of type_obj;
           

用法:

--插入資料
INSERT INTO obj_table SELECT type_obj(1, 'test') FROM dual;

--查詢資料
SELECT * FROM obj_table;

--更新資料
UPDATE obj_table SET obj_name = 'test1' WHERE id = 1;

--删除資料
DELETE FROM obj_table;
           

注意:這裡需要注意的是插入的資料需要用type_obj進行轉換,其他操作與普通表類似。