--先在oracle中创建scheduler用于执行shell
begin
DBMS_SCHEDULER.create_job(job_name => 'getTycData', job_type => 'EXECUTABLE', job_action => '/home/spider/opt/main.sh');
end;
--执行方法一
--PL/SQL developer
begin
DBMS_SCHEDULER.run_job('getTYCData');
end;
--sqlplus命令行
exec DBMS_SCHEDULER.run_job('getTYCData');
--执行方法二,使用存储过程,适用于informatica
--*****注意job名和存储过程名不可以相同,否则会报已有对象错误!!*****
create or replace procedure pcapp.getData
as
begin
DBMS_SCHEDULER.run_job('getTYCData');
end;
--在infa的post sql中使用即可调用远程服务器上的脚本
call pcapp.getData();
--删除scheduler
begin
DBMS_SCHEDULER.drop_job('getTYCData');
end;
select * from all_scheduler_jobs ;
说明:===========================================================
需要若干权限(execute、create external table等)
注意job名和存储过程名不可以相同,否则会报已有对象错误!!
设置oracle执行脚本的用户,无需重启oracle(默认为nobody,不行)
vim /u01/app/oracle/product/11.2.0/dbhome_1/rdbms/admin/externaljob.ora
run_user = oracle
run_group = oinstall
oracle用户对待执行的sh文件的各级路径和sh本身都需要有x权限(有时候全部权限都授好后仍然报错:"操作不被允许",可能是脚本运行时出错,报错信息不一定准,需要在shell
脚本中将日志输出到外部文件,在文件中查看正确的报错信息)
sh文件开头要加上这个: #!/bin/bash
sh中执行python时要加上类似下面的环境变量
#!/bin/bash
#下面这一句非常重要,防止oracle执行python脚本时报字符集错误
export PYTHONIOENCODING=utf-8
export LC_ALL=en_US.utf-8
export LANG=en_US.utf-8
export PATH=/home/gjspider/anaconda3/bin:$PATH
export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/instantclient_12_2
export LD_LIBRARY_PATH=$ORACLE_HOME
export PATH=$PATH:$ORACLE_HOME:$HOME/bin
export TNS_ADMIN=/oracle/instantclient_12_2/network/admin
python /home/gjspider/main.py > /home/gjspider/logs/`date '+%Y-%m-%d-%H-%M-%S'`.log 2>&1