2016-11-08 29 views
1

まずは、通常は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がどのように動作するかを理解するのに役立ちます。どうもありがとう!

答えて

2

collection(例:PL/SQLテーブル)には挿入できません。 SQL ServerとOracleがかなり異なるので、あなたは、これは適切なアプローチでチェックすることをお勧めします

SELECT ColumnA, ColumnB 
BULK COLLECT INTO tableVariableA 
FROM physicalTable 
WHERE [...]; 

:あなたは、コレクションを移入するuse the bulk collect syntaxをすることができます。プロシージャ内であってもプレーンSQL(at least prior to 12c)でPL/SQLテーブルを使用することはできません。にはPL/SQL型ではなくスキーマレベルの型が必要ですが、次に何をするかによって異なります。あなたは本当にコレクションを必要としないかもしれません。この違いを理解せずにT-SQLをPL/SQLに直接変換しようとすると、間違った経路が生じる可能性があります。実際の要件を理解してから、そのための最良のOracleメカニズムを見つけてください。

+2

Alex、ちょっとニックピック... 11g(私が推測する)からは、パッケージ化されたコレクション型をパイプライン化されたテーブル関数で使用できます。 Oracleは、パッケージのコンパイルの結果、それぞれのスキーマ・レベル・タイプ(通常はSYS_PLSQL接頭辞付き)をバックグラウンドで作成します。 – nop77svk

+1

@ nop77svk - [それは12cからだと思う](https://docs.oracle.com/database/121/LNPLS/release_changes.htm#LNPLS111)、しかし、良い点、私はそれについて忘れてしまった。 –

+1

Alex、それはNDSQLに純粋なPL/SQL型を(即時実行で)渡す機能です。私が意味するのは、[ここでは「データ型を返す」セクション(http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/tuning.htm#LNPLS834)です。 – nop77svk

関連する問題