2012-06-07 50 views
1

我有一個Oracle函數my_func(),它返回用戶類型的表。從Oracle中函數返回表中選擇的其他方法

我可以從現在選擇這種方式:

SELECT * FROM TABLE(my_func(3)); 

但我的項目不應該依賴於數據庫,我想有機會寫這篇文章:

SELECT * FROM my_func(3); 

是否有在Oracle中如何做到這一點?

+0

只要將TABLE看作SQL和PLSQL之間的橋樑。使用TABLE有什麼問題? (即使你可以刪除TABLE,你仍然會「依賴於數據庫」,你可以從中選擇) – tbone

+0

問題是,在Postgres中你可以選擇* from my_func()就是這樣。我只是不想修復代碼中包含此類調用的所有地方 – Oleg

+1

,但是您的my_func()代碼對於每個db平臺都會有所不同。所以你只關心使選擇數據庫不可知論? (在這種情況下你不能)。我的觀點是您的公司正在爲Oracle付款,因此請使用它的功能。一旦系統中存在更多的複雜性/需求,我已經看到了一些完全不可知的db代碼的嘗試,這些代碼在軌道上運行。 – tbone

回答

2

您必須使用表集合表達式Table()直接執行此操作。

如果您不需要傳入該參數,則可以在視圖中針對表集合表達式封裝查詢。

否則,可能有辦法通過打包的全局變量將參數傳遞給函數,但它可能不是獨立於數據庫的任何東西。

0

與甲骨文相比,您處於不同的星球上,而MS SQL則處於程序化的可能性。這是不是真的很難只是不同的概念

例1:

PROCEDURE Get_EligPlanTypes_sp (I_EMPLID   IN  VARCHAR2, 
           EligPlanTypesCur OUT CurRefType) IS 

    BEGIN 

--* Retrieve eligible plan types for entry into the plan object. 

    OPEN EligPlanTypesCur FOR SELECT DISPLAY_PLN_SEQ 
        ,PLAN_TYPE 
        ,OPTION_CD 
        ,ELECTION_MADE 
           FROM ENR_PARTIC_PLAN 
         WHERE EMPLID = I_EMPLID 
          ORDER BY DISPLAY_PLN_SEQ; 

    EXCEPTION 
    WHEN OTHERS THEN 
      RAISE; 

    END Get_EligPlanTypes_sp; 

示例函數:

CREATE OR REPLACE PACKAGE dba_Functions_Package 
AS 


Function InstrCount   (strValue  Varchar2 
       ,strTarget  Varchar2) 
       RETURN NUMBER; 


END dba_Functions_Package; 

/

CREATE OR REPLACE PACKAGE BODY dba_Functions_Package 
AS 
-- ********************************************************************* 
-- *** F U N C T I O N (InstrCount) D E C L A R A T I O N S  ***** 
-- ********************************************************************* 

Function InstrCount  (strValue  IN Varchar2 
      ,strTarget  IN Varchar2) 
    RETURN Number 
IS 
     numOccurs Integer := 0; 
     numReturn Number := -1; 
    BEGIN 

     While numReturn != 0 Loop 
      numReturn := Instr(strValue,strTarget,1,numOccurs+1); 
      If numReturn <> 0 Then 
       numOccurs := numOccurs + 1; 
      End If; 
     End Loop While; 

    RETURN(numOccurs); 

    EXCEPTION 
      WHEN OTHERS THEN RAISE; 

End InstrCount; 



END dba_Functions_Package; 

/

看看分層查詢。應該讓你沿着Link

0

不,Oracle沒有辦法做到這一點,沒有table()。 我會在調用中使用一個簡單的開關來確定「表」變量選擇。

相關問題