错误ORA-01722:创建实例化视图时无效的数字(Oracle SDE问题?)

问题描述 投票:0回答:1

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

我尝试了[]两侧的不同转换方法,例如to_number(),cast(x作为数字(x,x)),cast(作为数字(x,x)),cast(x作为int)。 C0],而且仅在左侧。原因是>=的左侧(TEST_IND_TABLE_BASIS.IND_VALUE)的类型为varchar2。这是由数据模型给出的。

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

感谢您的帮助。

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

>=
oracle materialized-views ora-01722
1个回答
0
投票

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

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   

还有更严格的含义:

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
© www.soinside.com 2019 - 2024. All rights reserved.