当这按预期工作时:
SQL>删除表TEST1;表已删除。SQL>创建表TEST1(COL1-INTEGER,COL2-INTEGER);表已创建。SQL>当1=1时插入2然后进入测试1(COL1,COL2)3从对偶中选择1,0;已创建1行。SQL>
我收到一个奇怪的"ORA-00918:列定义不明确"错误,试图用两列以上的列进行此操作:
SQL>删除表TEST1;表已删除。SQL>创建表TEST1(COL1整数,COL2整数,COL3整数);表已创建。SQL>当1=1时插入2然后进入测试1(COL1,COL2,COL3)3从对偶中选择1、0、0;然后进入测试1(COL1、COL2、COL3)*第2行出现错误:ORA-00918:列定义不明确SQL>
为什么我在这里收到ORA-00918错误?在INSERT WHEN…中,我可以选择的列数有限制吗。。。然后进入。。。选择模式?
注意:我使用的是Oracle 11.2.0.1.0,我试图在生产中执行的实际查询更复杂,并且引用了其他表(使用"VALUES"是不够的)。这只是一个简化的案例。。。
使用别名:
SQL> CREATE TABLE TEST1(COL1 INTEGER, COL2 INTEGER, COL3 INTEGER);
Table created.
SQL> INSERT WHEN 1=1
2 THEN INTO TEST1 (COL1, COL2, COL3)
3 SELECT 1 "1", 0 "2", 0 "3" FROM DUAL;
1 row created.
出现这种不明确的列错误的原因是,如果不提供别名,Oracle将使用一组规则来命名每一列。在这种情况下,第二列和第三列具有相同的名称("0"
),因此外部查询不能明确引用:
SQL> SELECT 1, 0, 0 FROM DUAL;
1 0 0
---------- ---------- ----------
1 0 0
Oracle在执行语义分析时不查看数据值。
我没有oracle,但问题似乎是内联查询(SELECT FROM DUAL)。我建议对该内联查询中的所有字段进行别名处理,然后重试。
INSERT WHEN 1=1
THEN INTO TEST1 (COL1, COL2, COL3)
SELECT 1 AS c1, 0 AS c2, 0 AS c3 FROM DUAL;
使用这个会发生什么?
INSERT WHEN 1=1
THEN INTO TEST1 (COL1, COL2, COL3)
SELECT 1 as col1, 0 as col2, 0 as col3 FROM DUAL;