我想从涉及空间表(基于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)表。
>=
您的数字分隔符错误试试这个:
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