ORA-00936 缺少表达式

Posted

技术标签:

【中文标题】ORA-00936 缺少表达式【英文标题】:ORA-00936 missing expression 【发布时间】:2012-11-02 05:54:42 【问题描述】:

以下声明:

INSERT INTO TABLE1(COL_1,COL2) VALUES(SELECT MAX(COL_1) FROM TABLE1), 'XYZ');

抛出错误:

ERROR at line 1:
ORA-00936: missing expression
 at the select clause. 
1. The table is empty for now.
2. COL_1 is a primary key intger field.

你能帮帮我吗?

【问题讨论】:

你有一个小错误。但是你的方法不是很好。如果您在 col_1 中没有任何值,.. 您无法通过 SELECT MAX(COL_1) FROM TABLE1 获得任何结果...如果您在 col_1 中有一些值.. 那么您总是将最大值(一个常数值)放在第一列..这种方法似乎没有改变..顺便说一句,您想实现什么? 我认为您正在尝试执行诸如插入 max(id)+1.. 之类的操作。您知道自动增量吗? 【参考方案1】:

试一试

    create table TABLE1 (COL_1 number, COL2 varchar2(5));

ALTER TABLE TABLE1
add CONSTRAINT t_pk PRIMARY KEY (col_1);

INSERT INTO TABLE1(COL_1,COL2) VALUES((SELECT nvl(MAX(COL_1),0) FROM TABLE1), 'XYZ');

INSERT INTO TABLE1(COL_1,COL2) VALUES((SELECT nvl(MAX(COL_1+1),0) FROM TABLE1), 'XYZ');

SQL Fiddle Demo

【讨论】:

【参考方案2】:

如果要将查询的结果用作标量表达式,请将整个(子)查询括在括号中,如下所示:

INSERT INTO TABLE1(COL_1,COL2) VALUES (
   (SELECT MAX(COL_1) FROM TABLE1),
  'XYZ'
);

另一方面,您可以在这里简单地使用different syntax:

INSERT INTO TABLE1(COL_1,COL2)
SELECT MAX(COL_1), 'XYZ' 
FROM TABLE1
group by  'XYZ';

【讨论】:

这两种解决方案有两种截然不同的结果。第一个插入一行,第二个为每个记录 ib TABLE1 插入一行。 @APC:这很奇怪,在 SQL Server 中没有区别:INSERT #1,INSERT #2。我的意思是,我也不希望这两者在 Oracle 中有所不同。无论如何,最奇怪的部分是我can't even test Oracle 中的第二个(即在 SQL Fiddle 的 Oracle 中,我没有任何其他可用的 Oracle。)它一直告诉我命令没有正确结束。关于 Oracle 中的 INSERT...SELECT,我必须知道一些关于手册的内容(对我来说)似乎不够明显。 其实我的评论是错误的。如果没有 GROUP BY 子句,第二个解决方案不会运行。使用 GROUP BY 子句,它将返回一行。 我认为 SQL Fiddle 有问题。 INSERT INTO ... SELECT 语法应该可以工作。【参考方案3】:

去掉一个多余的括号

INSERT INTO TABLE1(COL_1,COL2) SELECT MAX(COL_1) , 'XYZ' FROM TABLE1

【讨论】:

括号的数量必须匹配是对的,但是你选择了错误的解决方案。

以上是关于ORA-00936 缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章

ORA 00936 缺少表达式

ORA-00936: 缺少表达式解决方案 - 转换函数

出现错误 ORA-00936: 缺少表达式

ora:00936 缺少表达式错误

ORA-00936: 缺少表达式 oracle

ORA-00936: 缺少表达式