這個月專案中實現了乙個動態彙總並且匯出到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...