Oracle中的table()函數(shù)使用
一、序言
前段時(shí)間一直在弄報(bào)表,快被這些報(bào)表整吐了,然后接觸到了Oracle的table()函數(shù)。所以今天把table()函數(shù)的具體用法整理下,防止下次遇到忘記了。。
利用table()函數(shù),可接收輸入?yún)?shù),然后將pl/sql 返回的結(jié)果集代替table。由于表函數(shù)可將數(shù)據(jù)轉(zhuǎn)換分階段處理,并省去中間結(jié)果的存儲(chǔ)和緩沖表,所以它的速度相對(duì)物理表要快很多,當(dāng)然比直接查視圖更是快不少。
二、table()函數(shù)使用步驟
- 定義對(duì)象類(lèi)型
對(duì)象類(lèi)型定義:封裝了數(shù)據(jù)結(jié)構(gòu)和用于操縱這些數(shù)據(jù)結(jié)構(gòu)的過(guò)程和函數(shù)。由對(duì)象類(lèi)型頭、對(duì)象類(lèi)型體組成
對(duì)象類(lèi)型頭:用于定義對(duì)象的公用屬性和方法;
①屬性:最少要包含一個(gè)屬性,最多包含1000個(gè)屬性。定義時(shí)必須提供屬性名和數(shù)據(jù)類(lèi)型,但不能指定默認(rèn)值和not null。并且不能包括long、long raw、rowid、urowid和PL/SQL特有類(lèi)型(boolean%type%rowtype\ref curdor等);
② 可以包含也可以不包含方法,可以定義構(gòu)造方法、member方法、static方法、map方法和order方法。
③ 語(yǔ)法
create or replace type type_name as object ( v_name1 datatype [ ,v_name2 datatype,... ], [ member | static method1 spec, member | static method2 spec , ... ] ); -- type_name是對(duì)象類(lèi)型的名稱(chēng); -- v_name是屬性名稱(chēng); -- datatype是屬性數(shù)據(jù)類(lèi)型; -- method是方法的名稱(chēng);
對(duì)象類(lèi)型體:用于實(shí)現(xiàn)對(duì)象類(lèi)型頭所定義的公用方法。
① 方法類(lèi)型
方法 | 作用 | 說(shuō)明 |
---|---|---|
構(gòu)造方法 | 用于初始化對(duì)象并返回對(duì)象實(shí)例 | 與對(duì)象類(lèi)型同名的函數(shù),默認(rèn)的構(gòu)造方法參數(shù)是對(duì)象類(lèi)型的所有屬性。(9i前只能使用系統(tǒng)默認(rèn)的構(gòu)造方法、9i后可自定義構(gòu)造函數(shù),自定義必須使用constructor function關(guān)鍵字) |
member方法 | 用于訪問(wèn)對(duì)象實(shí)例的數(shù)據(jù) | 當(dāng)使用member方法時(shí),可以使用內(nèi)置參數(shù)self訪問(wèn)當(dāng)前對(duì)象實(shí)例。當(dāng)定義member方法時(shí),無(wú)論是否定義self參數(shù),它都會(huì)被作為第一個(gè)參數(shù)傳遞給member方法。但如果要定義參數(shù)self,那么其類(lèi)型必須要使用當(dāng)前對(duì)象類(lèi)型。member方法只能由對(duì)象實(shí)例調(diào)用,而不能由對(duì)象類(lèi)型調(diào)用。 |
static方法 | 用于訪問(wèn)對(duì)象類(lèi)型 | 可以在對(duì)象類(lèi)型上執(zhí)行全局操作,而不需要訪問(wèn)特定對(duì)象實(shí)例的數(shù)據(jù),因此static方法引用self參數(shù)。static方法只能由對(duì)象類(lèi)型調(diào)用,不能由對(duì)象實(shí)例調(diào)用(和member相反) |
map方法 | 可以在對(duì)多個(gè)對(duì)象實(shí)例之間排序;將對(duì)象實(shí)例映射成標(biāo)量數(shù)值來(lái)比較 | 可以定義map方法,但只能有一個(gè),與order互斥 |
order方法 | 只能比較2個(gè)實(shí)例的大小 | 定義對(duì)象類(lèi)型時(shí)最多只能定義一個(gè)order方法,而且map和order方法不能同時(shí)定義 |
② 語(yǔ)法
create or replace type body type_name as member | static method1 body; member | static method1 body;... -- type_name是對(duì)象類(lèi)型的名稱(chēng); -- method是方法的名稱(chēng); -- member | static 見(jiàn)上表格
- 基于對(duì)象類(lèi)型的表類(lèi)型
語(yǔ)法
create or replace type table_name as table of type_name; --table_name 表類(lèi)型名稱(chēng) --type_name 對(duì)象類(lèi)型名稱(chēng)
- 定義表函數(shù)
語(yǔ)法
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 函數(shù)名稱(chēng) -- p1,p2...pn 函數(shù)入?yún)? -- table_name 表函數(shù)名稱(chēng)
- 調(diào)用表函數(shù)
語(yǔ)法:
select * from table(function_name(20)); 或者 select * from the(select function_name(20) from dual); --function_name 定義好的表函數(shù)名稱(chēng)
三、table() 具體使用實(shí)例
公共部分對(duì)象類(lèi)型和表類(lèi)型創(chuàng)建
①對(duì)象類(lèi)型創(chuàng)建
create or replace type t_test as object( id integer, rq date, mc varchar2(60) );
② 表類(lèi)型創(chuàng)建
create or replace type t_test_table as table of t_test;
3.1 table()結(jié)合數(shù)組 使用
①創(chuàng)建表函數(shù)
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;
② 調(diào)用
select * from table(f_test_array(10)); 或 select * from the(select f_test_array(10) from dual);
3.2 table()結(jié)合PIPELINED函數(shù)(這次報(bào)表使用的方式)
① 創(chuàng)建表函數(shù)
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;
② 調(diào)用
select * from table(f_test_pipe(10)); 或 select * from the(select f_test_pipe(10) from dual);
3.3 table()結(jié)合系統(tǒng)包使用
①創(chuàng)建測(cè)試
create table test (id varchar2(20),mc varchar2(20));
②表中插入數(shù)據(jù)
insert into test values('1','mc1'); commit;
③ 查看表執(zhí)行計(jì)劃
explain plan for select * from test;
④調(diào)用
select * from table(dbms_xplan.display);
到此這篇關(guān)于Oracle之table()函數(shù)的使用提高查詢(xún)效率的文章就介紹到這了,更多相關(guān)Oracle table()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle使用in語(yǔ)句不能超過(guò)1000問(wèn)題的解決辦法
最近項(xiàng)目中使用到了Oracle中where語(yǔ)句中的in條件查詢(xún)語(yǔ)句,在使用中發(fā)現(xiàn)了問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于Oracle使用in語(yǔ)句不能超過(guò)1000問(wèn)題的解決辦法,需要的朋友可以參考下2022-05-05Oracle AWR(自動(dòng)工作量資料檔案庫(kù))的管理與維護(hù)詳解
這篇文章主要給大家介紹了關(guān)于Oracle AWR(自動(dòng)工作量資料檔案庫(kù))管理與維護(hù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10Oracle 12.2監(jiān)聽(tīng)無(wú)法啟動(dòng)解決方法
這篇文章主要介紹了Oracle 12.2監(jiān)聽(tīng)無(wú)法啟動(dòng)解決方法,需要的朋友可以參考下2017-11-11解決navicat 鏈接oracle時(shí)出現(xiàn)的各種問(wèn)題
這篇文章主要介紹了解決navicat 鏈接oracle時(shí)出現(xiàn)的各種問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08基于Oracle的面向?qū)ο蠹夹g(shù)入門(mén)基礎(chǔ)簡(jiǎn)析開(kāi)發(fā)者網(wǎng)絡(luò)Oracle
基于Oracle的面向?qū)ο蠹夹g(shù)入門(mén)基礎(chǔ)簡(jiǎn)析開(kāi)發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03Linux一鍵部署oracle安裝環(huán)境腳本(推薦)
這篇文章主要介紹了Linux一鍵部署oracle安裝環(huán)境腳本,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01