关于oracle数据库中出现ORA-00907: 缺失右括号的解决方法

最近在开发过程中使用oracle数据库,在程序中进行查询数据时遇到了“ORA-00907: 缺失右括号”的问题,但是如果直接把sql语句直接在数据库或PL/SQL中执行时,却又能够正常查询,为了解决这个问题,折腾了半天,查找了一些资料,所以就对各种导致出现“缺失右括号”的情况进行了整理总结

第一种,{union all中包含order by 导致报错缺失右括号}

// 原有错误SQLSELECT*FROM(SELECTCOLUMN_A,COLUMN_BFROMTABLE_EXAMPLE_AORDER BYCOLUMN_AUNION ALLSELECTCOLUMN_A,COLUMN_BFROMTABLE_EXAMPLE_BORDER BYCOLUMN_A ) A;// 修改后SELECT*FROM(SELECTCOLUMN_A,COLUMN_BFROMTABLE_EXAMPLE_AUNION ALLSELECTCOLUMN_A,COLUMN_BFROMTABLE_EXAMPLE_B ) A;ORDER BY COLUMN_A

第二种,{ in (子查询)的用法中,子查询不能使用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

第三种,{一般是SQL不规范导致,仔细检查即可}

示例如下

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 创建表时表中字段有关键字示例如下: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 KEYname 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 WhereID in(select ID From T_EXAMPLE_B where D_DATE>=TO_DATE(‘2015-01-20’,’yyyy-mm-dd’))该语句在数据库直接执行是没问题的,但是在程序中执行传入日期参数时有时会报缺失右括号的错误,为了解决这个问题,我们可以改变传入的日期参数的格式,如下:SELECT * FROM T_EXAMPLE WhereID 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 字段名缺少双引号如果在创建表时,表字段名全部是大写,则不存在此问题