今天来复习一下在shell中如何登陆oracle,并执行脚本或命令。
我编了以下这个小程序,起名为test.txt用于修改表结构,并执行几条输出命令:
#!/bin/sh
sqlplus -s "scott/tiger"<alter table bymt add sales_nm varchar2(6);
alter table binfo add sales_nm varchar2(6);
Set timing on --该设置可以使结果中显示语句执行耗时
Set time on --此设置没有意义,因为无论是此文件的日志还是使用spool,都不显示sqlplus的提示符
Set serveroutput on
select * from v\$instance; --此处用于说明在使用$符号时,需要前面加斜杠进行转义,否则shell会将其看做是调用的变量
spool /u01/mig/TL/test.log --在shell脚本中,只要用sqlplus登录了,也是可以开启spool,将程序块结果放入文件中的
declare
i_vc_code varchar2(2);
i_vc_schema varchar2(100);
begin
i_vc_code:='NZ';
i_vc_schema:='NZNZ';
dbms_output.put_line('CODE is:'||i_vc_code);
dbms_lock.sleep(5);
dbms_output.put_line('SCHEMA NAME is :'||i_vc_chema);
end;
/
@/u01/mig/TL/tian.txt --在此环境下,还可以执行一些子脚本
spool off
调用此文件,就可以执行sqlplus环境下的命令的。
[oracle@TSTDB TL]$ ./test.txt &
[1] 11076
[oracle@TSTDB TL]$
此处需要提一句,如果执行某个单独的文件,在文件执行语句后面加 &就可以令其快速返回光标(后台执行);
但如果像上面的程序那样,存在嵌套,可能还没来得及在执行该语句后再次按下回车,子程序已经开始执行了,这时候就无法后台执行了。
若使用命令 nohup ./test.txt &
会将结果日志记录到nohup.out文件中,并能够迅速返回光标。
我们使用shell,一般都是处于两个目的:
1)自动化
2)在我们期望执行的时间执行
要达到第二个目的,可以在系统设置crontab任务。
[oracle@TSTDB TL]$ crontab -e --添加,用VI命令将需要设置的任务写入文件,所有用户的定时任务放在/var/spool/cron中
[oracle@TSTDB TL]$ crontab -l --查看
20 18 * * * /u01/mig/TL/bsd_exe.txt >>nohup.out
[oracle@TSTDB TL]$ crontab -r --删除
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26451536/viewspace-764802/
,如需转载,请注明出处,否则将追究法律责任。