【问题标题】:Why is DBMS Scheduler changing database session language?为什么 DBMS 调度程序更改数据库会话语言?
【发布时间】:2018-09-28 06:54:02
【问题描述】:

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

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

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

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

DBMS 调度程序是否会更改 DB 会话的语言,或者是否在某处设置了默认参数?

【问题讨论】:

  • 根本问题是您的 PL/SQL 对当前的 NLS 语言做出了假设——为什么要这样做?失败的代码到底是什么? (edit您的问题,请勿在 cmets 中发布代码)

标签: oracle dbms-scheduler


【解决方案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 代码不应该对客户端设置做出假设。如果必须使用特定语言完成某些操作,请避免所有隐式转换并在代码中对该语言进行硬编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多