关于oracle数据库中出现ORA-00907:缺失右括号的解决⽅法
原⽂地址:
ORA-00907: 缺失右括号
前⾔
最近在开发过程中使⽤oracle数据库,在程序中进⾏查询数据时遇到了“ORA-00907: 缺失右括号”的问题,但是如果直接把sql语句直接在数据库或PL/SQL中执⾏时,却⼜能够正常查询,为了解决这个问题,折腾了半天,查了⼀些资料,所以就对各种导致出现“缺失右括号”的情况进⾏了整理总结。⾏⽂如下。
(1) union all中order by 导致缺失右括号
在有union all的⼦查询中使⽤了order by,会导致缺失右括号的错误,事实上在有union all的⼦查询中根本没必要进⾏排序,因为联合之后⼜组成了⼀个新的集合,之前的排序对新集合⽽⾔没什么⽤,直接查询联合之后的新集合然后再进⾏排序即可。
⽰例如下:
select * from
(
select COLUMN_A,COLUMN_B
from TABLE_EXAMPLE_A
order by COLUMN_A
union all
select COLUMN_A,COLUMN_B
from TABLE_EXAMPLE_B
order by COLUMN_A
) A;
解决⽅案如下:
select * from
(
select COLUMN_A,COLUMN_B
from TABLE_EXAMPLE_A
union all
select COLUMN_A,COLUMN_B
from TABLE_EXAMPLE_B
) A;
order by COLUMN_A
(2) in (⼦查询)的⽤法中,⼦查询不能使⽤order by!
此种情况跟1中描绘的有些类似,⾸先在in(⼦查询)⽤法使⽤order by 会报错,其次,⼦查询⾥⽤order by,纯属多此⼀举,⼦查询的⽬的,只是出合适的数据。如果需要排序,在外边排即可。
⽰例如下:
Select * from TABEL_EXAMPLE where ID in(select ID from TABLE_EXAMPLE where ID>500 oder by ID DESC)
解决⽅案如下:
Select * from TABEL_EXAMPLE where ID in(select ID from TABLE_EXAMPLE where ID>500)oder by ID DESC
(3)创建表时,提⽰缺失⼜括号
3.1 创建表时关键字顺序错
⽰例如下:
CREATE TABLE T_EXAMPLE (
id serial primary key,
t_id int not null default 0
)
解决⽅案如下:
CREATE TABLE T_EXAMPLE (
id serial primary key,
t_id int default 0 not null
)
3.2 创建表时表中字段有关键字
⽰例如下:select语句查询日期
CREATE TBALE T_EXAMPLE
(
id number(18,0) not null,
desc varchar(45) not null
)
解决⽅案如下:
给对应的关键字加上双引号
CREATE TBALE T_EXAMPLE
(
id number(18,0) not null,
“desc” varchar(45) not null
)
3.3 创建表时未对表中的字段设置长度
⽰例如下:
CREATE TABEL T_EXAMPLE
(
id bigint NOT NULL PRIMARY KEY,
name varchar NOT NULL
)
解决⽅案如下:
CREATE TABEL T_EXAMPLE
(
id bigint NOT NULL PRIMARY KEY,
name varchar(200) NOT NULL
)
3.4 创建主外键约束时外键类型跟主键类型不完全⼀致
主外键类型不完全⼀致时也会报缺失右括号的错误
3.5 两条语句中缺少分隔符“,”
⽰例如下:
CREATE TABEL T_EXAMPLE
(
id bigint NOT NULL PRIMARY KEY
name varchar NOT NULL
)
解决⽅案如下:
CREATE TABEL T_EXAMPLE
(
id bigint NOT NULL PRIMARY KEY ,
name varchar(200) NOT NULL
)
(4)SQL查询时发⽣缺失右括号错误
在查询时引发缺失右括号错误的原因⼤多数在于查询语句中有关于⽇期的转化、过滤。很多时候都是因为关于⽇期类型的转化少了单引号。
⽰例如下:
SELECT * FROM T_EXAMPLE Where T_DATE in(2015-01-20 22:37)
解决⽅案如下:
SELECT * FROM T_EXAMPLE Where T_DATE in(‘2015-01-20 22:37‘)
还有⼀种情况就是在where过滤中进⾏时间的转化时,有时候在sql/plus中直接执⾏没问题,但是在程序中却会出现错误。
⽰例如下:
SELECT * FROM T_EXAMPLE Where
ID in(select ID From T_EXAMPLE_B where D_DATE>=TO_DATE(‘2015-01-20’,’yyyy-mm-dd’))
该语句在数据库直接执⾏是没问题的,但是在程序中执⾏传⼊⽇期参数时有时会报缺失右括号的错误,为了解决这个问题,我们可以改变传⼊的⽇期参数的格式,如下:
SELECT * FROM T_EXAMPLE Where
ID in(select ID From T_EXAMPLE_B where D_DATE>=TO_DATE(20150120,’yyyy-mm-dd’))
还有⼀种关于oracle⽇期格式的错误是:ORA-01840: 输⼊值对于⽇期格式不够长
⽰例如下:select to_date(2015-01-01,’yyyy-mm-dd’) from dual
为了解决这个问题,我们也可以⽤改变传⼊的⽇期参数的格式,来解决,如下:
select to_date(20150101,’yyyy-mm-dd’) from dual
(5)其他导致缺失右括号的原因
5.1 书写错误,确实缺少了⼀个括号
5.2 字段名缺少双引号
如果在创建表时,表字段名全部是⼤写,则不存在此问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论