从Oracle中选择函数返回表的其他方法

时间:2012-06-07 12:36:26

标签: java sql oracle hibernate

我有一个Oracle函数my_func(),它返回用户类型的表。

我现在可以这样选择:

SELECT * FROM TABLE(my_func(3));

但是我的项目不应该依赖于数据库,我希望有机会写这个:

SELECT * FROM my_func(3);

有没有办法在Oracle中执行此操作?

3 个答案:

答案 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”变量。