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 * fromTABEL_EXAMPLE where ID in(select ID from TABLE_EXAMPLE where ID>500 oder byID DESC)
解決方式例如以下:
Select * fromTABEL_EXAMPLE where ID in(select ID from TABLE_EXAMPLE where ID>500)oder by ID DESC
3. 創建表時,提示缺失又括號
3.1 創建表時keyword順序錯
示比例如以下:
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 創建表時表中字段有keyword
示比例如以下:
CREATE TBALET_EXAMPLE
(
id number(18,0) not null,
desc varchar(45) not null
)
解決方式例如以下:
給相應的keyword加上雙引號
CREATE TBALET_EXAMPLE
(
id number(18,0) not null,
“desc” varchar(45) not null
)
3.3 創建表時未對表中的字段設置長度
示比例如以下:
CREATE TABELT_EXAMPLE
(
id bigint NOT NULL PRIMARY KEY,
name varchar NOT NULL
)
解決方式例如以下:
CREATE TABELT_EXAMPLE
(
id bigint NOT NULL PRIMARY KEY,
name varchar(200) NOT NULL
)
3.4 創建主外鍵約束時外鍵類型跟主鍵類型不全然一致
主外鍵類型不全然一致時也會報缺失右括號的錯誤
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
為了解決問題,我們也能夠用改變傳入的日期參數的格式,來解決,例如以下:
selectto_date(20150101,‘yyyy-mm-dd‘) from dual
5. 其它導致缺失右括號的原因
5.1 書寫錯誤,確實缺少了一個括號
5.2 字段名缺少雙引號
假設在創建表時,表字段名所有是大寫,則不存在此問題
ORA-00907: 缺失右括號問題整理解決