Oracle 自定義資料型別Type

2021-07-04 17:54:48 字數 4660 閱讀 3118

這個月專案中實現了乙個動態彙總並且匯出到excel的功能,媽蛋,為了實現這個功能,乙個網格頁面就用了20+個儲存過程和自定義函式,終於完成了初步測試工作,其中快把我所掌握的不掌握的oracle知識都快用完了,其中有行轉列(xml)、列轉行、動態表、動態sql、自定義type、管道函式、資料流函式等,為了加深印象,便於梳理自己的知識體系,也給一些需要的人一些幫助吧,先從自定義資料型別開始總結。

記錄資料型別(record)記錄表型別(table),其中記錄資料型別record儲存是一條記錄,記錄表型別table用來儲存多條記錄。如果記錄資料型別record是一維陣列的話,記錄表型別table就是二維陣列。

自定義型別有兩種寫法:type……is和create type ……,兩者區別在於:前者一般在儲存過程和函式中定義,其作用域是所在過程或函式,而後者宣告物件型別,物件型別則是作為乙個資料庫物件(像表、索引、檢視、觸發器一樣,是乙個資料庫物件),可以過程或函式中使用,還可以在定義表時,作為欄位的型別。

type type_name is record (

欄位名1 資料庫變數型別1,

欄位名2 資料庫變數型別2,

...欄位名n 資料庫變數型別n

);其中type_name:自定義型別的名稱

declare 

type type_employee is

record(

name varchar2(100),

age number(3),

wage number(7,2)

);v_employs type_employee;

v_name varchar2(100);

v_age number(3);

v_wage number(7,2);

i integer;

begin

select name, age, wage into v_employs from employees where employeesid = '750adfd0-f8cd-4a64-a2f8-736f8802ec87';

v_name := v_employs.name;

v_age := v_employs.age;

v_wage := v_employs.wage;

dbms_output.put_line(v_name);

dbms_output.put_line(v_wage);

dbms_output.put_line(v_age);

end;

cmo     888,888    1
type table_typename  is table of element_type

index

by [binary_integer | pls_integer | varray2];

其中:1、table_typename :自定義型別的名稱。

2、element_type:任意資料基本型別(varchar2, ingeger, number等)、記錄資料型別(即type type_name is

record的自定義型別)等。

3、index

by:該語句的作用是使number型別的下標自增長,自動初始化,並分配空間,有了該語句,向表記錄插入元素時,不需要顯示初始化,也不需要通過擴充套件來分配空間。(必須寫否則會報錯,ora-06531:reference

to uninitialized collection)

declare 

type type_employee is

record(

name varchar2(100),

age number(3),

wage number(8,2)

);type type_employee_var is table of varchar2(100) index

by binary_integer;

type type_employee_rec is table of type_employee index

by binary_integer;

type type_employee_rowtype is table of employees%rowtype index

by binary_integer;

v_table_name type_employee_var;

v_table_emps type_employee_rec;

v_table_rwotype type_employee_rowtype;

begin

dbms_output.put_line('------------基本型別varchar2表記錄------------');

select name into v_table_name(1) from employees where employeesid = '750adfd0-f8cd-4a64-a2f8-736f8802ec87';

select name into v_table_name(2) from employees where employeesid = 'a01038ce-e6af-4ed4-806c-03ac7b26150b';

dbms_output.put_line(v_table_name(1));

dbms_output.put_line(v_table_name(2));

dbms_output.put_line('------------自定義record型別表記錄------------');

select name, age, wage into v_table_emps(1) from employees where employeesid = '750adfd0-f8cd-4a64-a2f8-736f8802ec87';

select name, age, wage into v_table_emps(2) from employees where employeesid = 'a01038ce-e6af-4ed4-806c-03ac7b26150b';

dbms_output.put_line('name:'||v_table_emps(1).name||', '||'age:'||v_table_emps(1).age||', '||'wage:'||v_table_emps(1).wage);

dbms_output.put_line('name:'||v_table_emps(2).name||', '||'age:'||v_table_emps(2).age||', '||'wage:'||v_table_emps(2).wage);

dbms_output.put_line('------------表記錄型別表記錄------------');

select * into v_table_rwotype(1) from employees where employeesid = '750adfd0-f8cd-4a64-a2f8-736f8802ec87';

select * into v_table_rwotype(2) from employees where employeesid = 'a01038ce-e6af-4ed4-806c-03ac7b26150b';

dbms_output.put_line('name:'||v_table_rwotype(1).name||', '||'age:'||v_table_rwotype(1).age||', '||'wage:'||v_table_rwotype(1).wage||', '||'ranks :'||v_table_rwotype(1).ranks );

dbms_output.put_line('name:'||v_table_rwotype(2).name||', '||'age:'||v_table_rwotype(2).age||', '||'wage:'||v_table_rwotype(2).wage||', '||'ranks :'||v_table_rwotype(2).ranks );

end;

###執行結果

輸出結果:

————基本型別varchar2表記錄————

cmo

sbpm

————自定義record型別表記錄————

name:cmo, age:8, wage:888,888

name:sbpm, age:30, wage:10,000

————表記錄型別表記錄——————

name:cmo, age:8, wage:888,888, ranks :1

name:sbpm, age:30, wage:10,000, ranks :2

附:

create

orreplace type tabletype as

table

of varchar2(32676)

這張表返回乙個字段

返回多個

create

table t_test

( id number(10),

passwd varchar2(10)

);create

orreplace type cur_test is

table

of t_test;

Oracle 自定義資料型別Type

oracle 自定義型別的種類 記錄資料型別 record 和記錄表型別 table 其中記錄資料型別record儲存是一條記錄,記錄表型別table用來儲存多條記錄。如果記錄資料型別record是一維陣列的話,記錄表型別table就是二維陣列。自定義型別有兩種寫法 type is和create t...

自定義資料型別

include include using namespace std typedef double weight,tall struct student int main cout for int i 0 i 4 i return 0 貼上正確的輸出 這裡tall和weight都是自己可以輸入的 ...

Oracle基礎 自定義資料型別篇

對oracle資料庫中基本資料型別進行擴充套件,實現自定義資料型別,封裝物件多屬性。自定義物件型別,create type employee object as object 使用as關鍵字 ename varchar2 20 自定義的物件的屬性 empno number 自定義記錄型別 decla...