Oracle12.1+使用dbms_scheduler执行SQL脚本时设置NLS_LANG与工作目录问询
Oracle DBMS_SCHEDULER 服务器端SQLPlus任务配置方案
1. 服务器端SQLPlus启动前设置NLS_LANG环境变量
可以实现,Oracle 12.1及以上版本的DBMS_SCHEDULER支持通过SET_ATTRIBUTE指定ENVIRONMENT_VARIABLES属性,为作业进程自定义环境变量,Linux环境下直接写入NLS_LANG配置即可生效,无需修改SQL脚本源码。
配置示例:
BEGIN -- 基础作业创建 DBMS_SCHEDULER.CREATE_JOB( job_name => 'RUN_BATCH_SQL', job_type => 'EXECUTABLE', job_action => '/bin/bash', number_of_arguments => 2, enabled => FALSE, auto_drop => FALSE, credential_name => 'YOUR_HOST_CREDENTIAL' -- 替换为你创建的主机凭证名称 ); -- 设置NLS_LANG环境变量,多个环境变量用空格分隔即可 DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'RUN_BATCH_SQL', attribute => 'ENVIRONMENT_VARIABLES', value => 'NLS_LANG=CZECH_CZECH REPUBLIC.AL32UTF8 ORACLE_HOME=/u01/app/oracle/product/12.1.0/dbhome_1' ); -- 配置SQLPlus执行参数 DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('RUN_BATCH_SQL', 1, '-c'); DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE('RUN_BATCH_SQL', 2, 'sqlplus schema_user/schema_pass@DB_SERVICE @/path/to/your/script.sql'); DBMS_SCHEDULER.ENABLE('RUN_BATCH_SQL'); END; /
2. 修改服务器端SQLPlus任务的工作目录
可以实现,无需修改脚本内的spool路径,推荐两种方案:
- 方案1:直接在执行命令中切换目录,在SQLPlus启动命令前添加
cd指令切换到目标spool输出目录,示例如下:
将上述SQL的第二个参数值替换为:cd /your/target/spool/path && sqlplus schema_user/schema_pass@DB_SERVICE @/path/to/your/script.sql - 方案2:通过
DBMS_SCHEDULER的WORKING_DIRECTORY属性直接指定作业工作目录,配置示例:
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => 'RUN_BATCH_SQL', attribute => 'WORKING_DIRECTORY', value => '/your/target/spool/path' ); END; /
注意事项
- 你配置的主机凭证对应的Linux用户,必须拥有目标工作目录的读写权限,同时需要有SQL脚本路径的读取权限,避免作业因权限问题执行失败。
- 若SQL脚本存储在客户端本地,建议提前将脚本上传到服务器可访问的路径(如服务器本地目录、NFS共享目录),确保服务器SQLPlus进程可正常读取脚本文件。
内容的提问来源于stack exchange,提问作者user_alex
相关产品推荐
相关产品推荐

