Oracle VS MS SQL-User Define Function

摘要: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

打雜打久了,就變成打雜妹

程式寫久了,就變成老乞丐