为什么调度程序链步骤的最大长度为24个字节?

时间:2018-01-05 16:28:04

标签: oracle dbms-scheduler

我正在尝试创建一个30字节长的链式步骤。它失败了。

设置:

SQL> begin
  2      dbms_scheduler.create_program(
  3         program_name => lpad('A', 30, 'A')
  4       , program_type => 'PLSQL_BLOCK'
  5       , program_action => 'begin null; end;'
  6         );
  7      dbms_scheduler.create_chain('CHAIN_NAME');
  8  end;
  9  /

PL/SQL procedure successfully completed.

创建连锁步骤:

SQL> begin
  2      dbms_scheduler.define_chain_step(
  3          chain_name => 'CHAIN_NAME'
  4        , step_name => lpad('A', 30, 'B')
  5        , program_name => lpad('A', 30, 'A')
  6          );
  7  end;
  8  /
begin
*
ERROR at line 1:
ORA-27465: invalid value BBBBBBBBBBBBBBBBBBBBBBBBBBBBBA for attribute step_name
ORA-06512: at "SYS.DBMS_ISCHED", line 5057
ORA-06512: at "SYS.DBMS_ISCHED", line 1760
ORA-06512: at "SYS.DBMS_SCHEDULER", line 1786
ORA-06512: at line 2

我有一个字节语义数据库。

描述DBA_SCHEDULER_CHAIN_STEPS,STEP_NAME的最大长度为128个字节,即32个4字节的unicode字符:

SQL> desc dba_scheduler_chain_steps;
 Name                                      Null?    Type
 ----------------------------------------- -------- --------------------
 OWNER                                     NOT NULL VARCHAR2(128)
 CHAIN_NAME                                NOT NULL VARCHAR2(128)
 STEP_NAME                                 NOT NULL VARCHAR2(128)
 ...

如果我查看DBA_SCHEDULER_CHAIN_STEPS的定义,那么STEP_NAME列来自SYS.SCHEDULER $ _STEP.VAR_NAME。本专栏的定义是:

SQL> select data_type, data_length, char_length, char_used
  2    from dba_tab_columns
  3   where owner = 'SYS'
  4     and table_name = 'SCHEDULER$_STEP'
  5     and column_name = 'VAR_NAME';

DATA_TYPE DATA_LENGTH CHAR_LENGTH C
--------- ----------- ----------- -
VARCHAR2          128         128 B

换句话说,对象名称的最大大小为128个字节(32个Unicode字符)。

Oracle数据库管理员指南的

Section 29.2 "About Scheduler Objects and Their Naming"

  

Scheduler对象完全遵循数据库对象的命名规则,并与其他数据库对象共享SQL命名空间。

In other words

  

名称长度必须为1到30个字节...

但是,如果我创建一个名为24字节长的链步骤和一个名称长度为25字节的链步骤,则24字节名称将成功,25字节将失败

SQL> begin
  2      dbms_scheduler.define_chain_step(
  3          chain_name => 'CHAIN_NAME'
  4        , step_name => lpad('A', 24, 'B')
  5        , program_name => lpad('A', 30, 'A')
  6          );
  7  end;
  8  /

PL/SQL procedure successfully completed.

SQL> begin
  2      dbms_scheduler.define_chain_step(
  3          chain_name => 'CHAIN_NAME'
  4        , step_name => lpad('A', 25, 'B')
  5        , program_name => lpad('A', 30, 'A')
  6          );
  7  end;
  8  /
begin
*
ERROR at line 1:
ORA-27465: invalid value BBBBBBBBBBBBBBBBBBBBBBBBA for attribute step_name
ORA-06512: at "SYS.DBMS_ISCHED", line 5057
ORA-06512: at "SYS.DBMS_ISCHED", line 1760
ORA-06512: at "SYS.DBMS_SCHEDULER", line 1786
ORA-06512: at line 2

: - (

为什么呢?这是在任何地方记录的吗?

1 个答案:

答案 0 :(得分:3)

根据MoS Doc ID 2246248.1

  

DBMS_SCHEDULER.define_chain_step属性“step_name”的这种限制是由开发明确编码和确认的。

     

- 属性'step_name'不能超过24个字符或包含'。'

该文件仅涉及11.2.0.3,但它仍然在12.1和12.2中抛出错误。

这并没有真正解释为什么,但它有点记录......只是没有在文档中。