對于自定義類型,通常也會分為兩類,一類是子類型,一類是普通類型。
子類型
這種類型最簡單,類似類型的一個别名,主要是為了對常用的一些類型簡單化,它基于原始的某個類型,如: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進行轉換,其他操作與普通表類似。