摘要:Oracle VS MS SQL-User Define Function
以前使用MS SQL時,User Define Function是我很愛用的一項功能,大家都知道,View是無法傳入傳數,只能把View先建好,等使用時下Where條件,但Function讓我覺得好用的是,它就像可以傳參數的View,也可以回傳Table,所以,它的結果還可以跟Table做Join,這點是讓我覺得超讚的地方,因此打雜妹的用法都是先將一些Table利用Function傳入參數,得到較少的資料集Table,再來做Join,效能差很多,因此來新公司,也研究了一下Oracle怎麼做,也許熟Oracle的人覺得佷簡單,但以我這種第一次接觸Oracle的人,也是拿起書來,上網查了一下,才懂做法,因此也把它跟MS SQL的做法比較一下,個人覺得,MS SQL寫法是簡便多了
好心人士提醒了我,此法會吃Temp DB,二種廠牌都一樣,要視DB狀況運用
Oracle
create type tab_data is object (col1 number,col2 Number,col3 Number);
create type tab_data_list is table of tab_data;
create or replace package pkTestFun as
function fnjotest (P_theType in Number ) return tab_data_list ;
end;
create or replace package body pkTestFun as
function fnjotest (P_theType in Number ) return tab_data_list is
retrec tab_data_list;
begin
SELECT Col1,Col2,Col3 bulk collect into retrec
From Users WHERE theType=P_theType ;
return retrec;
end fnjotest ;
end;
MS SQL
Create Function ufnTest(@P_theType integer=0)
returns Table
as
Return
(
SELECT Col1,Col2,Col3 From Users
WHERE theType=P_theType
)
Go
Oracle 用法
select a.col1,a.col2,a.col3.b.xxx
FROM table(pkTestFun .fnjotest (:P_theType )) a
inner tableb b on a.col1=b.col1
MS SQL用法
select a.col1,a.col2,a.col3
from ufnTest() as a
inner join tableb as b on a.col1=b.col1
打雜打久了,就變成打雜妹
程式寫久了,就變成老乞丐