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 缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章