我的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
你能帮帮我吗?谢谢! :)
答案 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行更改为:
/
这不是必需的,但可以帮助解决您的问题。