まずは、通常はMSSQLで作業しています。しかし、私はMSSQLにストアドプロシージャを持っています。これはOracleで今使用する必要があります。そして、私はOracleにとって全く新しいものです。正しい方法を知りません。Oracleでユーザ定義のテーブルタイプ
MS SQLストアドプロシージャでユーザー定義のテーブルタイプを使用する必要がありました。これは、ストアドプロシージャ内で「論理」テーブルを使用しているためです。このプロシージャ内の動的SQLステートメントにも渡す必要があります"物理的な"テーブルの変数/パラメータ)。
私は以前に他の関数用に作成したパッケージにoracle関数を追加し始めました。それは私がまた表Iは、このパッケージのヘッダに、この関数内で使用する(MSSQLでユーザー定義テーブル型)のレイアウトを説明
TYPE resultRec IS RECORD
(
[result columns]
);
TYPE resultTable IS TABLE OF resultRec;
Function MyFunctionName([A LOT PARAMETERS]) RETURN resultTable PIPELINED;
ように見えます。 これまでのところ良いことでしたが、今ではテーブル変数やユーザー定義のテーブル型をどこに宣言しなければならないのか分かりません。また、パッケージ・ヘッダーに入れようとしましたが、パッケージ本体でこれらの表を使用しようとすると、関数が記述されているため、表またはビューは存在しません。 私もそれがパッケージ本体内またはそのように見える私の機能のブロックにテーブルを記述してみました:
FUNCTION MyFunctionName
(
[MyParameters]
)
RETURN resultTable PIPELINED is rec resultrec;
TYPE tableVariableA IS TABLE OF tableRecA;
TYPE tableVariableB IS TABLE OF tableRecB;
BEGIN
INSERT INTO tableVariableA
SELECT ColumnA, ColumnB FROM physicalTable WHERE[...];
[A LOT MORE TO DO...]
END;
しかし、この場合には、Oracleはまた、それがテーブルを知らないことを、私に語りましたまたは表示する。 さらにいくつかのことを試しましたが、最後に使用する必要がある表をOracleに伝えることができませんでした。 この場合、oracleがどのように動作するかを理解するのに役立ちます。どうもありがとう!
Alex、ちょっとニックピック... 11g(私が推測する)からは、パッケージ化されたコレクション型をパイプライン化されたテーブル関数で使用できます。 Oracleは、パッケージのコンパイルの結果、それぞれのスキーマ・レベル・タイプ(通常はSYS_PLSQL接頭辞付き)をバックグラウンドで作成します。 – nop77svk
@ nop77svk - [それは12cからだと思う](https://docs.oracle.com/database/121/LNPLS/release_changes.htm#LNPLS111)、しかし、良い点、私はそれについて忘れてしまった。 –
Alex、それはNDSQLに純粋なPL/SQL型を(即時実行で)渡す機能です。私が意味するのは、[ここでは「データ型を返す」セクション(http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/tuning.htm#LNPLS834)です。 – nop77svk