【问题标题】:Job - ORACLE - problem - ORA-01722 after upgrade version作业 - ORACLE - 问题 - 升级版本后的 ORA-01722
【发布时间】:2022-01-11 20:54:45
【问题描述】:

我将 ORACLE 升级到版本 19。自动任务停止工作 - 但是,手动过程调用工作正常,而自动任务执行不能正常工作。

我收到一个错误: 'ORA-01722: 无效号码ORA-06512,第 4 行'

我有一个表:TEST_TABLE(字段名称是示例):

  1. Test1 varchar(16 字节)
  2. Test2 编号
  3. Test3 编号
  4. Test4 编号
  5. Test5 编号
  6. Test6 时间戳 (6)

我的程序:

create or replace TEST_PROCEDURE AS
BEGIN
 execute immediate 'TRUNCATE TABLE TEST_TABLE';
INSERT INTO TEST_TABLE ( Test1, Test2, Test3, Test4, Test5, Test6 ) 
SELECT Test1, Test2, Test3, Test4, Test5, sysdate FROM TABLE_TEST_DATA;
END;

如上所述 - 如果我手动运行它 - 它可以工作,如果在任务中 - 它不起作用。

问题在于 ORACLE 19。版本 12 很好。

可能是什么原因?此错误代码表示字符转换 - 但在我的情况下,此背景没有错误。

谢谢。

【问题讨论】:

  • 显然TABLE_TEST_DATA中的列与TEST_TABLE中的列具有不同的数据类型
  • 并且自动和手动执行有不同的 NLS 设置——从错误来看,大概是 NLS_NUMERIC_CHARACTERS,这可能是通过语言环境推断出来的。取决于“自动化任务”的含义,但两个数据库可能具有不同的基础设置(查询nls_database_paramaters);否则它是客户端/应用程序会话设置。但是您不应该依赖隐式转换或 NLS 设置。

标签: oracle


【解决方案1】:

检查参数NLS_DATABASE_PARAMETERS, NLS_INSTANCE_PARAMETERS, NLS_SESSION_PARAMETERS

SQL> SELECT 'Database nls_numeric_characters = "' || VALUE || '"'
  2    FROM NLS_DATABASE_PARAMETERS
  3  WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS'
  4  UNION ALL
  5  SELECT 'Instance nls_numeric_characters = "' || VALUE || '"'
  6    FROM NLS_INSTANCE_PARAMETERS
  7  WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS'
  8  UNION ALL
  9  SELECT 'Session nls_numeric_characters = "' || VALUE || '"'
 10    FROM NLS_SESSION_PARAMETERS
 11  WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';

'DATABASENLS_NUMERIC_CHARACTERS="'||VALUE||'"'
-------------------------------------------------------------------
Database nls_numeric_characters = ".,"
Instance nls_numeric_characters = ""
Session nls_numeric_characters = ",."

您需要添加正确的NLS_NUMERIC_CHARACTERSEXECUTE IMMEDIATE 'alter session set NLS_NUMERIC_CHARACTERS = '',.''';或设置正确的NLS_DATABASE_PARAMETERS.

CREATE TABLE DEMIN.TABLE_TEST_DATA
(
    TEST1    VARCHAR2 (28),
    TEST2    VARCHAR2 (28),
    TEST3    VARCHAR2 (28),
    TEST4    VARCHAR2 (28),
    TEST5    VARCHAR2 (28)
);

CREATE TABLE DEMIN.TEST_TABLE
(
    TEST1    NUMBER (28, 4),
    TEST2    NUMBER (28, 4),
    TEST3    NUMBER (28, 4),
    TEST4    NUMBER (28, 4),
    TEST5    NUMBER (28, 4),
    TEST6    DATE
);

INSERT INTO DEMIN.TABLE_TEST_DATA VALUES('1,5','1,5','1,5','1,5','1,5');
COMMIT;

CREATE OR REPLACE PROCEDURE DEMIN.TEST_PROCEDURE
AS
BEGIN
    EXECUTE IMMEDIATE 'TRUNCATE TABLE TEST_TABLE';
    EXECUTE IMMEDIATE 'alter session set  NLS_NUMERIC_CHARACTERS = '',.''';
    INSERT INTO DEMIN.TEST_TABLE (TEST1, TEST2, TEST3, TEST4, TEST5, TEST6)
         SELECT TEST1, TEST2, TEST3, TEST4, TEST5, SYSDATE
           FROM DEMIN.TABLE_TEST_DATA;
    COMMIT;
END;


SQL> TRUNCATE TABLE TEST_TABLE;

Table truncated.

SQL> SELECT Test1, Test2, Test3, Test4, Test5, sysdate FROM TEST_TABLE;

no rows selected

SQL> SELECT Test1, Test2, Test3, Test4, Test5, sysdate FROM TABLE_TEST_DATA;

TEST1                        TEST2                        TEST3                        TEST4                        TEST5                        SYSDATE
---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------------------------- ---------
1,5                          1,5                          1,5                          1,5                          1,5                          11-JAN-22

SQL> select 5/10 from dual;

      5/10
----------
        ,5

SQL> alter session set  NLS_NUMERIC_CHARACTERS = '.,';

Session altered.

SQL> select 5/10 from dual;

      5/10
----------
        .5

SQL> exec TEST_PROCEDURE;

PL/SQL procedure successfully completed.

SQL> SELECT Test1, Test2, Test3, Test4, Test5, sysdate FROM TEST_TABLE;

     TEST1      TEST2      TEST3      TEST4      TEST5 SYSDATE
---------- ---------- ---------- ---------- ---------- ---------
       1,5        1,5        1,5        1,5        1,5 11-JAN-22

SQL> alter session set  NLS_NUMERIC_CHARACTERS = '.,';

Session altered.

SQL> SELECT Test1, Test2, Test3, Test4, Test5, sysdate FROM TEST_TABLE;

     TEST1      TEST2      TEST3      TEST4      TEST5 SYSDATE
---------- ---------- ---------- ---------- ---------- ---------
       1.5        1.5        1.5        1.5        1.5 11-JAN-22

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2021-03-12
    • 2019-02-16
    • 2012-09-06
    • 2011-01-03
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多