2016-05-21 16 views
0

私のシェルスクリプトに問題があります。ファイルからtable1(空)にデータを挿入し、table1とtable2を比較していくつかのフィールドを更新したいとします。1つのテーブルを挿入し、別のシェルスクリプトで更新する

最初の部分は正しいものの、2番目の部分は機能しません。 最初の部分の後にtable1を切り捨ててスクリプトをもう一度実行するだけの方法があります。

#!/bin/ksh  
DATE=`date +"%Y%m%d"` 
PATH_LD=$HOME/myscripts/script_anuk 
    PATH_BIN=$HOME/bin/myscripts/script_anuk 
    PATH_LOG=$HOME/log/myscripts/script_anuk 


    logfile=$PATH_LOG/script_anuk$FECHA.log 
    logfileMod=$PATH_LOG/script_anuk_mod$FECHA.log 

    # Insert 

    sqlldr parfile=$PATH_LD/script_anuk_param.par USERID=$CONSQLPLUS 

    # Update 
     sqlplus -s $CONSQLPLUS << EOF! 

    SET SERVEROUTPUT ON 

    SET FEEDBACK OFF 
    exec declare cursor d1 is select d.book, d.phone,d.pencil from table1 d,table2 n where d.book = n.book; whow number:=0;begin for r1 in d1 loop update table2 set phone=r1.phone,pencil=r1.pencil where book = r1.book; whow := whow + 1;if mod(whow,10000) = 0 then commit; end if;end loop;end; 
    exit 
    EOF! 

マイ.PAR

Par 
USERID=/ 
CONTROL=$HOME/myscripts/script_anuk/script_anuk_param.ctl 
DATA=$HOME/myscripts/script_anuk/data1.dat 
LOG=$HOME/log/myscripts/script_anuk/script_anuk_param.log 
BAD=$HOME/myscripts/script_anuk/error/script_anuk_param.bad 
DISCARD=$HOME/myscripts/script_anuk/error/script_anuk_param.dsc 
ERRORS=1000000 
ROWS=500 
DIRECT=FALSE 

マイ.CTL

Ctl 
LOAD DATA 
INFILE * 
INTO TABLE table1 
APPEND 
FIELDS TERMINATED BY ';' 
(book , 
phone   , 
pencil) 
) 

は、私は1時間のすべて(挿入データや更新)

私のシェルスクリプトを作りたいです

Can you私を助けてくれる?ありがとうございました! :)ここで

+0

どのような種類のエラーがありますか?行が更新されないだけですか? table1とtable2にはいくつの行がありますか?コミットポイント/カウントに達したことはありますか?コミットポイント(10000)に達したことを確認してください。 – tale852150

+0

行が更新されないだけです。表1 - 50.000レコード表2 - 350.000レコード –

+0

sqlldr部分を単独で実行してから、SQL * Plusで匿名PL/SQLブロックを別々に実行してエラーが発生していないかどうかを確認しましたか? – tale852150

答えて

0

:私はdeclareexecを呼び出すことはありません

1 declare 
    2  cursor d1 is 
    3  select d.book, d.phone,d.pencil 
    4  from table1 d,table2 n 
    5  where d.book = n.book; 
    6 
    7  whow number:=0; 
    8  begin 
    9   for r1 in d1 loop 
10   update table2 
11   set phone=r1.phone, 
12    pencil=r1.pencil 
13   where book = r1.book; 
14 
15   whow := whow + 1; 
16   if mod(whow,10000) = 0 then 
17   commit; 
18   end if; 
19  end loop; 
20  commit; 
21  end; 
22/

お知らせ、私は最後にcommitを追加しますすべての行が終了する前にコミットされていることを確認し、ブロックを完了して実行するには/が必要でした。私はこれがあなたが持つ問題の要点だと思います。

また、SQL * Plusセッション情報を取得するためだけに、STDOUTおよびSTDERRをファイルにリダイレクトすることもできます。これは必須ではありませんが、あなたの問題を解決する上で助けになる可能性が

sqlplus -s $CONSQLPLUS >>$logfile 2>&1 << EOF! 

:へのあなたのSQLPLUSラインを変更してみてください。

+0

OPのコードはOKです。コードを複数の行に分割するのを止めるだけで 'exec'を使用したことはありませんでしたが、それでも有効です。 'exec'を削除した場合にのみ'/'が必要です。また、SQL \ * Plusは終了時にコミットしますが、明示的に明示的に行う方がはっきりしています。だから、これは良く見え、ヘレドックに埋め込むことができますが、それは問題の要点ではないと私は思います。 –

+0

良い点@アレックスプール。'コミット'では、Oracle 11gでSET EXITCOMMIT OFFを指定した$ ORACLE_HOME/sqlplus/admin/glogin.sqlファイルでオーバーライドできるため、完了したことを確認したかったのです。 – tale852150

+0

本当に、とにかく傷つくことはありません。彼らは最後の反復からの行だけでなく、行が更新されないと言っています。しかし、何が起こっているのかは分かりません。 –

0

がデータである

drop table table1; 
drop table table2; 
create table table1 (book varchar2(5), phone varchar2(10), pencil varchar2(10)); 
create table table2 (book varchar2(5), phone varchar2(10), pencil varchar2(10)); 
insert into table1 values ('Book1','Phone1','Pencil1'); 
insert into table1 values ('Book2','Phone2','Pencil2'); 
insert into table2 values ('Book1','Phone1','oops'); 
insert into table2 values ('Book3','Phone3','Pencil3'); 
commit; 

select * from table1; 

BOOK PHONE  PENCIL 
----- ---------- ---------- 
Book1 Phone1  Pencil1 
Book2 Phone2  Pencil2 

select * from table2; 

BOOK PHONE  PENCIL 
----- ---------- ---------- 
Book1 Phone1  oops  
Book3 Phone3  Pencil3 

BOOKは、両方のテーブル内で一意であれば、あなたの代わりにあなたのスクリプトでこれを行うことができます

update table2 t2 
set (phone, pencil) = 
    (select t1.phone, t1.pencil 
    from table1 t1 
    where t1.book = t2.book) 
; 

注意 - BOOKは、主キーまたは一意でない場合、 BOOKのt2の行と一致するt1の行が1つ以上あるときは、この更新はエラーで失敗します。私はあなたの無名ブロックで探していますし、私のようなSQL * Plusセッションを経由して正常に実行

+0

ありがとうございます。私は.parのデータが必要です。カーソルが必要です(10000レコーダーをコミットしてください) –

関連する問題