2016-10-18 29 views
2

私は長いストアドプロシージャを持っています。格納されたprocには何度も、(括弧内の)下位のサブクエリが繰り返されます。サブクエリを再利用する方法

繰り返されたコードを統合することはできますか?つまり、SQL Serverでは、テーブル変数を宣言します。次に、行をテーブル変数に挿入します。次に、テーブル変数に対して照会します。少なくとも、DRYの原則を適用するのに役立ちます。

これをOracleに統合する同等の方法はありますか? Oracleのテーブルコレクションは、コードベースを縮小するものではないようです。

CTEは再利用できないので問題はないと思いますか?

+0

'param_in_ReportingDataSetID'は動的値ですか、それとも固定ですか? –

+0

動的(数字パラメータ) – Hoppe

+0

コードを再利用するにはCTEが最適ですが、パラメータを受け入れるとは思えません。 –

答えて

3

Subquery factoring(他のデータベース・プラットフォームでの別名のCTE)例えば、何が必要です:

with dataset as (select datasetid 
       from Reportingdatasetmembers 
       where ReportingDatasetID = param_in_ReportingDataSetID) 
select ... 
from some_table_1 
where ... 
and datasetid in (select datasetid from dataset) 
union all 
select ... 
from some_table_2 
where ... 
and datasetid in (select datasetid from dataset); 
0

長い変数v_queryを作成します。 と その後、 v_queryを宣言:=

とコールv_query 試みたが、あなたが本当にやりオラクルで

0

作業いくつかの時間を見ていないよりは '(param_in_ReportingDataSetID Reportingdatasetmembers どこReportingDatasetID =からdatasetidを選択します ''') SQL Serverと同じです。定義されたレコードのテーブルである型の変数を宣言します。ような何か:

type my_rec_type is record (v_datasetid number(20)) 
type my_table_type is table of my_rec_type index by pls_integer; 
my_table_var my_table_type; 

は...コード内で使用して、特定のID

v_paramReportingDataSetID:= 12345; 

に設定します...カーソル

v_paramReportingDataSetID number(20); 

のためにあなたのパラメータを定義します。.. 。文でカーソルを使用する

open my_cursor for (select datasetid from Reportingdatasetmembers 
    where ReportingDatasetID = :v_paramReportingDataSetID); 

...今テーブル/アレイ/データがコードの残りの部分で使用可能な、my_table_var変数である...カーソル

fetch my_cursor bulk collect into my_table_var; 

からテーブル変数を取り込みます。

0

@Boneist's wayは正解ですが、のヒントを選択して追加する必要があります。だから早くなります。

with dataset as (select /*+ materialize */ 
         datasetid 
       from Reportingdatasetmembers 
       where ReportingDatasetID = param_in_ReportingDataSetID) 
select ... 
from some_table_1 
where ... 
and datasetid in (select datasetid from dataset) 
union all 
select ... 
from some_table_2 
where ... 
and datasetid in (select datasetid from dataset); 
+0

注意してください。 materliazeは文書化されていないヒントなので、動作が変わる可能性があります。私はプロダクションコードでその使用をお勧めしません。私はこのヒントに起因するエラーに遭遇したので、私はそれに余分に注意しています!さらに、サブクエリが問合せの複数の場所で使用される場合、Oracleはおそらくこれを実現することを決定します。 – Boneist

関連する問題