我有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调度程序是否更改了数据库会话的语言,或者某处是否存在默认参数集?
答案 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代码永远不应该对客户端设置做出假设。如果必须以特定语言完成某些操作,请避免所有隐式转换并在代码中对该语言进行硬编码。