ユーザータイプのテーブルを返す Oracle 関数 my_func() があります。
次の方法で選択できます。
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;
/
階層クエリを見てください。リンクを取得する必要があります
いいえ、Oracle では table() なしでそれを行う方法はありません。呼び出しで単純なスイッチを使用して、選択する「テーブル」変数を決定します。