为什么DBMS Scheduler会更改数据库会话语言?

时间:2018-04-18 06:37:44

标签: oracle dbms-scheduler

我有LEVSTAT_PLNGRP程序需要在特定时间调用,作为响应,它在一个DB表中创建一个条目。

最初select VALUE from V$NLS_PARAMETERS;查询返回SWEDISH作为输出。

当我手动运行LEVSTAT_PLNGRP程序时,它会在相应的表中输入正确的数据,并且select VALUE from V$NLS_PARAMETERS;查询在运行后返回SWEDISH作为输出。

但是当我尝试通过DBMS Scheduler运行LEVSTAT_PLNGRP过程时,它无法在表中输入,select VALUE from V$NLS_PARAMETERS;查询在运行后返回ENGLISH作为输出。

DBMS调度程序是否更改了数据库会话的语言,或者某处是否存在默认参数集?

1 个答案:

答案 0 :(得分:1)

DBMS_SCHEDULER使用创建作业的会话的NLS设置。这可能与创建过程的会话的NLS设置不同。

例如,我的会话默认NLS_LANGUAGE是ENGLISH:

SQL> declare a number; begin a := 1/0; end;
  2  /
declare a number; begin a := 1/0; end;
*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at line 1

如果我将其更改为瑞典语并创建它使用瑞典语运行的作业:

SQL> alter session set nls_language = 'Swedish';

Session ar andrad.

SQL> begin
  2     dbms_scheduler.create_job(
  3             job_name => 'TEST_JOB1',
  4             job_type => 'PLSQL_BLOCK',
  5             job_action => 'declare a number; begin a := 1/0; end;',
  6             enabled => true
  7     );
  8  end;
  9  /

PL/SQL-procedur har utforts.

SQL> select errors from dba_scheduler_job_run_details where job_name = 'TEST_JOB1';

ERRORS
--------------------------------------------------------------------------------
ORA-01476: division med noll
ORA-06512: vid rad 1

SQL>

但是程序永远不会因为NLS设置而失败。 PL / SQL代码永远不应该对客户端设置做出假设。如果必须以特定语言完成某些操作,请避免所有隐式转换并在代码中对该语言进行硬编码。