我有一个Oracle函数my_func(),它返回用户类型的表。
我现在可以这样选择:
SELECT * FROM TABLE(my_func(3));
但是我的项目不应该依赖于数据库,我希望有机会写这个:
SELECT * FROM my_func(3);
有没有办法在Oracle中执行此操作?
答案 0 :(得分:2)
您必须使用表集合表达式Table()直接执行此操作。
如果您不需要传递该参数,则可以在视图中对表集合表达式封装查询。
否则,可能有办法通过打包的全局变量将参数传递给函数,但它可能不会像数据库无关。
答案 1 :(得分:0)
在程序存在性方面,与MS SQL相比,你处于与oracle不同的星球上。这不仅仅是不同的概念
<强>例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
答案 2 :(得分:0)
不,如果没有table(),Oracle无法做到这一点。 Id在调用中使用一个简单的开关来确定要从中选择的“table”变量。