2016-07-11 14 views
0

一部の従来のSQLローダー・スクリプトを外部表に変換しています。外部表が稼動しているので、次のステップでは外部表のデータを表に取り込みます。内のすべての行の定数として使用されているシーケンスの次の値であり、このようなセッションIDとしてSQLローダー、、、を使用してデータをロードするときに、追加のロジックは、ありOracle 11g - シーケンスから一定の値を持つ表の行を移入

Load Data                 
Append 
Into Table my_table 
Fields Terminated by "|" Trailing Nullcols   
(                    
    MY_COL     "Trim(:SOME_COL)",           
    SESS_ID     CONSTANT #$SESSION$#, 
    FILEREC     RECNUM, 
    REC_ID     SEQUENCE(MAX) 
) 

:SQL Loaderスクリプトは次のようになりますバッチ。私は、以下の方法で行うことを計画していたが、私は(私もINSERT文を使用しようとしましたが、その場合には、すべてのレコードは、シーケンスから次の値を取得します)サブクエリでシーケンスを使用することはできません。

CREATE table my_table(
    my_col, 
    session 
) 
AS SELECT 
    e.my_col, 
    my_seq.nextval 
FROM my_external_table e; 

質問 - すべての行にsequence.nextvalの定数値を設定する方法はありますか?私は、テーブルを作成し、セッションIDの列を更新するなどの複数のステップでそれを行うことができます知っていますが、(PL/SQLを回避しようとしている)単一のSQLステートメントでそれを行う方法があるのだろうか?計画結果は以下の通りです:

my_col seq.nextval 
aaaaaa 99 
bbbbbb 99 
cccccc 99 

しかし、(insert文を使用した場合)私は次の取得しています:

my_col seq.nextval 
aaaaaa 99 
bbbbbb 100 
cccccc 101 

答えて

0

seq.nextval常に次の値を返します。あなたはseq.currvalを探しています。

悲しいことに、seq.currvalでは、同じセッションで以前にseq.nextvalを使用する必要があります。 currvalnextvalの値を返します。したがって、SQL *ローダー操作では、あらかじめseq.nextvalを実行していることを納得させることができないため、不運になります。

だから、複数のステップが必要です。

+0

解決策「my_seq.nextval」を持つテーブルに現在のセッションIDを挿入してから、そのテーブルの最大セッションIDをターゲットテーブルに選択します –

+0

これはうまく動作します。 – AnoE