【问题标题】:Error ORA-01722: Invalid number when creating materialized view (Oracle SDE problem?)错误 ORA-01722:创建实体化视图时编号无效(Oracle SDE 问题?)
【发布时间】:2019-11-19 08:58:07
【问题描述】:

我想从涉及空间表(基于 SDE)和 oracle 非空间表的查询中创建物化视图。只执行查询,有效,但只要我想创建一个物化视图(或表),就会出现错误“ORA-01722:无效编号”。

我尝试了不同的转换方法,例如 to_number()、cast(x as numeric(x,x))、cast(as number(x,x))、cast(x as int),在>= 也仅在左侧。原因是>= 的左侧(TEST_IND_TABLE_BASIS.IND_VALUE)是 varchar2 类型。这是由数据模型给出的。

下面的简化示例有效。我的假设是 SDE 引起了麻烦?您能在我的代码中发现另一个可能的问题吗?

这里是我的问题的简化(工作)版本。在原始代码中,表 TEST_IND_TABLE_BASIS 是一个空间 (SDE) 表。

CREATE TABLE
    TEST_IND_THRSHLD
    (
        CD VARCHAR(64) NOT NULL,
        THRSHLD INTEGER
        --CONSTRAINT IND_THRSHLD_PK PRIMARY KEY (INDICATOR)
    );

INSERT INTO TEST_IND_THRSHLD (CD, THRSHLD) VALUES ('INDICATOR_1', 2);
INSERT INTO TEST_IND_THRSHLD (CD, THRSHLD) VALUES ('INDICATOR_2', 50)

CREATE TABLE
    TEST_IND_TABLE_BASIS
    (
        ID INTEGER NOT NULL,
        IND_VALUE VARCHAR(32)--,
        --CONSTRAINT IND_THRSHLD_PK PRIMARY KEY (INDICATOR)
    );    
INSERT INTO TEST_IND_TABLE_BASIS (ID, IND_VALUE) VALUES (1,'1.362');    
INSERT INTO TEST_IND_TABLE_BASIS (ID, IND_VALUE) VALUES (2,'2.362');                                                                         


CREATE MATERIALIZED VIEW MV_TEST AS
SELECT   TEST_IND_TABLE_BASIS.ID
        ,CASE WHEN
             cast(TEST_IND_TABLE_BASIS.IND_VALUE as numeric) >= (SELECT THRSHLD FROM TEST_IND_THRSHLD WHERE CD = 'INDICATOR_1')
             THEN 0
             ELSE 1
         END AS FLAG
FROM TEST_IND_TABLE_BASIS   

【问题讨论】:

    标签: oracle materialized-views ora-01722


    【解决方案1】:

    您的数字分隔符错误 试试这个:

    CREATE MATERIALIZED VIEW MV_TEST AS
    SELECT   TEST_IND_TABLE_BASIS.ID
            ,CASE WHEN
                 to_number(replace(TEST_IND_TABLE_BASIS.IND_VALUE, '.',',')) >= (SELECT THRSHLD FROM TEST_IND_THRSHLD WHERE CD = 'INDICATOR_1')
                 THEN 0
                 ELSE 1
             END AS FLAG
    FROM TEST_IND_TABLE_BASIS
    

    更确切地说:

    SELECT   TEST_IND_TABLE_BASIS.ID
            ,CASE WHEN
                 to_number(TEST_IND_TABLE_BASIS.IND_VALUE, '9999999999D9999', 'NLS_NUMERIC_CHARACTERS='',.''') >= (SELECT THRSHLD FROM TEST_IND_THRSHLD WHERE CD = 'INDICATOR_1')
                 THEN 0
                 ELSE 1
             END AS FLAG
    FROM TEST_IND_TABLE_BASIS
    

    输出:

    1   0
    2   0
    

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2021-05-03
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多