1

虽然这按预期工作:

SQL> 删除表 TEST1;

桌子掉了。

SQL> 创建表 TEST1(COL1 整数,COL2 整数);

表已创建。

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 从 DUAL 中选择 1、0、0;
然后进入 TEST1(COL1、COL2、COL3)
          *
第 2 行的错误:
ORA-00918: 列定义不明确

SQL>

为什么我在这里收到 ORA-00918 错误?我可以在 INSERT WHEN ... THEN INTO ... SELECT 模式中选择多少列有限制吗?

注意:我使用的是 Oracle 11.2.0.1.0,我尝试在生产中执行的实际查询更复杂,并且引用了其他表(并且使用“VALUES”是不够的)。这只是简化的情况...

4

3 回答 3

2

我没有甲骨文,但问题似乎是内联查询(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;
于 2012-07-12T08:38:11.293 回答
2

使用别名:

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 在执行语义分析时不查看数据值。

于 2012-07-12T08:38:45.957 回答
1

你用这个会发生什么?

INSERT WHEN 1=1
THEN INTO TEST1 (COL1, COL2, COL3)
SELECT 1 as col1, 0 as col2, 0 as col3 FROM DUAL;
于 2012-07-12T08:40:39.217 回答