插入一个表并使用shellscript更新另一个表

时间:2016-05-21 10:02:39

标签: oracle shell unix plsql sh

我的shell脚本有问题。我想将文件中的数据插入table1(空),然后将table1与table2进行比较并更新一些字段。

第一部分是正确的,但第二部分不起作用。 它的唯一工作方式是在第一部分之后我截断table1并再次运行脚本。

我想一次制作所有东西(插入数据和更新)

我的炮弹:

ok

我的.par

    #!/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!

我的.ctl

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
你能帮帮我吗?谢谢! :)

2 个答案:

答案 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不是主键或唯一,那么每当t1中有> 1行与BOOK上的t2行匹配时,此更新将失败并显示错误。

答案 1 :(得分:0)

我正在查看您的匿名阻止,我通过SQL * Plus会话成功运行它:

  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  /

注意我没有在exec之前调用declare,我在末尾添加commit以确保在退出之前提交所有行,并且我需要{{1}完成并执行块。我认为这是你遇到问题的症结所在。

您可能还希望将STDOUT和STDERR重定向到文件,以捕获SQL * Plus会话信息。尝试将sqlplus行更改为:

/

这不是必需的,但可以帮助解决您的问题。