哪个预言机会话变量控制 varchar2 'fitting'到表列?



我观察到无法解释的奇怪行为:

行插入全局时态表的 SP 在从 Oracle 开发人员调用时引发错误"列的值为大"。

同时,当从应用程序调用此 SP 时,它工作正常。

快速搜索 Oracle 文档并没有让我知道什么样的会话级别变量可以负责这些事情。请指出我错过的文档。

此类问题的原因之一 依赖于 NLS 的隐式转换可能是。下面的示例显示了如何在列类型为VARCHAR2时将 DATE 作为参数传递时收到此类错误:

SQL> create global temporary table d_tab (x varchar2(8))
  2  /
Table created.
SQL> create or replace procedure d_ins
  2  (
  3    p_x in date
  4  )
  5  is
  6  begin
  7     insert into d_tab values(p_x);
  8  end;
  9  /
Procedure created.
SQL> alter session set nls_date_format = 'YYYYMMDD';
Session altered.
SQL> exec d_ins(sysdate)
Pl/SQL prcoedure completed.
SQL> alter session set nls_date_format = 'DD-MM-YYYY';
Session altered.
SQL> exec d_ins(sysdate)
BEGIN d_ins(sysdate); END;
*
error in line 1:
ORA-12899: value too large for column string (actual: 10, maximum: 8)
ORA-06512: in  "SCOTT.D_INS", line 7 
ORA-06512: in  line 1 

附言此外,问题可能在于当您使用 Unicode 字符集时以 BYTE (通过 defaul) 指定列长度时,其中符号可以占用超过 1 个字节。因此,将列的定义更改为 VARCHAR2(...CHAR) 并查看结果。

似乎您使用的是本地语言值,因此这可能会导致不一致(我在下面的示例中使用了俄语字符):

SQL> create table t1 (x varchar2(1 byte));
Table created.
SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';
VALUE                                                                           
--------------------------------------------------------------------------------
AL32UTF8                                                                        
SQL> insert into t1 values('А');
insert into t1 values('А')
                      *
error in line 1:
ORA-12899: value too large for column "SCOTT."T1"."X" string (actual: 2, maximum: 1)
SQL> alter table t1 modify (x varchar2(1 char));
Table altered.
SQL> insert into t1 values('A');
1 row inserted.

最新更新