1

ユーザータイプのテーブルを返す Oracle 関数 my_func() があります。

次の方法で選択できます。

SELECT * FROM TABLE(my_func(3));

しかし、私のプロジェクトはデータベースに依存するべきではありません。これを書く機会が欲しいです:

SELECT * FROM my_func(3);

Oracleでこれを行う方法はありますか?

4

3 に答える 3

2

これを直接行うには、テーブル コレクション式 Table() を使用する必要があります。

そのパラメーターを渡す必要がない場合は、ビューのテーブル コレクション式に対するクエリをカプセル化できます。

それ以外の場合は、パッケージ化されたグローバル変数を介してパラメーターを関数に渡す方法があるかもしれませんが、データベースに依存しないようなものではない可能性があります。

于 2012-06-07T12:49:25.873 に答える
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;

/

階層クエリを見てください。リンクを取得する必要があります

于 2012-06-07T13:00:55.313 に答える
0

いいえ、Oracle では table() なしでそれを行う方法はありません。呼び出しで単純なスイッチを使用して、選択する「テーブル」変数を決定します。

于 2012-06-07T13:45:40.633 に答える