目錄
- 一、序言
- 二、table()函式使用步驟
- 三、table() 具體使用實體
- 3.1 table()結合陣列 使用
- 3.2 table()結合PIPELINED函式(這次報表使用的方式)
- 3.3 table()結合系統包使用
一、序言
前段時間一直在弄報表,快被這些報表整吐了,然后接觸到了Oracle的table()函式,所以今天把table()函式的具體用法整理下,防止下次遇到忘記了,,
利用table()函式,可接收輸入引數,然后將pl/sql 回傳的結果集代替table,由于表函式可將資料轉換分階段處理,并省去中間結果的存盤和緩沖表,所以它的速度相對物理表要快很多,當然比直接查視圖更是快不少,
二、table()函式使用步驟
- 定義物件型別
-
物件型別定義:封裝了資料結構和用于操縱這些資料結構的程序和函式,由物件型別頭、物件型別體組成
-
物件型別頭:用于定義物件的公用屬性和方法;
①屬性:最少要包含一個屬性,最多包含1000個屬性,定義時必須提供屬性名和資料型別,但不能指定默認值和not null,并且不能包括long、long raw、rowid、urowid和PL/SQL特有型別(boolean%type%rowtype\ref curdor等);
② 可以包含也可以不包含方法,可以定義構造方法、member方法、static方法、map方法和order方法,
③ 語法
create or replace type type_name as object (
v_name1 datatype [ ,v_name2 datatype,... ],
[ member | static method1 spec, member | static method2 spec , ... ]
);
-- type_name是物件型別的名稱;
-- v_name是屬性名稱;
-- datatype是屬性資料型別;
-- method是方法的名稱;
-
物件型別體:用于實作物件型別頭所定義的公用方法,
① 方法型別
| 方法 | 作用 | 說明 |
|---|---|---|
| 構造方法 | 用于初始化物件并回傳物件實體 | 與物件型別同名的函式,默認的構造方法引數是物件型別的所有屬性,(9i前只能使用系統默認的構造方法、9i后可自定義建構式,自定義必須使用constructor function關鍵字) |
| member方法 | 用于訪問物件實體的資料 | 當使用member方法時,可以使用內置引數self訪問當前物件實體,當定義member方法時,無論是否定義self引數,它都會被作為第一個引數傳遞給member方法,但如果要定義引數self,那么其型別必須要使用當前物件型別,member方法只能由物件實體呼叫,而不能由物件型別呼叫, |
| static方法 | 用于訪問物件型別 | 可以在物件型別上執行全域操作,而不需要訪問特定物件實體的資料,因此static方法參考self引數,static方法只能由物件型別呼叫,不能由物件實體呼叫(和member相反) |
| map方法 | 可以在對多個物件實體之間排序;將物件實體映射成標量數值來比較 | 可以定義map方法,但只能有一個,與order互斥 |
| order方法 | 只能比較2個實體的大小 | 定義物件型別時最多只能定義一個order方法,而且map和order方法不能同時定義 |
② 語法
create or replace type body type_name as
member | static method1 body;
member | static method1 body;...
-- type_name是物件型別的名稱;
-- method是方法的名稱;
-- member | static 見上表格
- 基于物件型別的表型別
語法
create or replace type table_name as table of type_name;
--table_name 表型別名稱
--type_name 物件型別名稱
- 定義表函式
語法
create or replace function function_name ([p1,p2...pn]) return table_name
as
v_test table_name := table_name();
begin
...
end loop;
return v_test;
end function_name;
-- function_name 函式名稱
-- p1,p2...pn 函式入參
-- table_name 表函式名稱
- 呼叫表函式
語法:
select * from table(function_name(20));
或者
select * from the(select function_name(20) from dual);
--function_name 定義好的表函式名稱
三、table() 具體使用實體
公共部分物件型別和表型別創建
①物件型別創建
create or replace type t_test as object(
id integer,
rq date,
mc varchar2(60)
);
② 表型別創建
create or replace type t_test_table as table of t_test;
3.1 table()結合陣列 使用
①創建表函式
create or replace function f_test_array(n in number default null) return t_test_table
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
v_test.extend();
v_test(v_test.count) := t_test(i,sysdate,'mc'||i);
end loop;
return v_test;
end f_test_array;
② 呼叫
select * from table(f_test_array(10));
或
select * from the(select f_test_array(10) from dual);
3.2 table()結合PIPELINED函式(這次報表使用的方式)
① 創建表函式
create or replace function f_test_pipe(n in number default null) return t_test_table PIPELINED
as
v_test t_test_table := t_test_table();
begin
for i in 1 .. nvl(n,100) loop
pipe row(t_test(i,sysdate,'mc'||i));
end loop;
return;
end f_test_pipe;
② 呼叫
select * from table(f_test_pipe(10));
或
select * from the(select f_test_pipe(10) from dual);
3.3 table()結合系統包使用
①創建測驗
create table test (id varchar2(20),mc varchar2(20));
②表中插入資料
insert into test values('1','mc1');
commit;
③ 查看表執行計劃
explain plan for select * from test;
④呼叫
select * from table(dbms_xplan.display);
大概就這么幾個,如果后面有新的用法再補充,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/552173.html
標籤:其他
上一篇:mysql資料記錄
下一篇:返回列表
