我有一個Oracle函數my_func(),它返回用戶類型的表。從Oracle中函數返回表中選擇的其他方法
我可以從現在選擇這種方式:
SELECT * FROM TABLE(my_func(3));
但我的項目不應該依賴於數據庫,我想有機會寫這篇文章:
SELECT * FROM my_func(3);
是否有在Oracle中如何做到這一點?
我有一個Oracle函數my_func(),它返回用戶類型的表。從Oracle中函數返回表中選擇的其他方法
我可以從現在選擇這種方式:
SELECT * FROM TABLE(my_func(3));
但我的項目不應該依賴於數據庫,我想有機會寫這篇文章:
SELECT * FROM my_func(3);
是否有在Oracle中如何做到這一點?
您必須使用表集合表達式Table()直接執行此操作。
如果您不需要傳入該參數,則可以在視圖中針對表集合表達式封裝查詢。
否則,可能有辦法通過打包的全局變量將參數傳遞給函數,但它可能不是獨立於數據庫的任何東西。
與甲骨文相比,您處於不同的星球上,而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
不,Oracle沒有辦法做到這一點,沒有table()。 我會在調用中使用一個簡單的開關來確定「表」變量選擇。
只要將TABLE看作SQL和PLSQL之間的橋樑。使用TABLE有什麼問題? (即使你可以刪除TABLE,你仍然會「依賴於數據庫」,你可以從中選擇) – tbone
問題是,在Postgres中你可以選擇* from my_func()就是這樣。我只是不想修復代碼中包含此類調用的所有地方 – Oleg
,但是您的my_func()代碼對於每個db平臺都會有所不同。所以你只關心使選擇數據庫不可知論? (在這種情況下你不能)。我的觀點是您的公司正在爲Oracle付款,因此請使用它的功能。一旦系統中存在更多的複雜性/需求,我已經看到了一些完全不可知的db代碼的嘗試,這些代碼在軌道上運行。 – tbone