ORA-00907: 缺失右括號 整理解決

ORA-00907: 缺失右括號

前言

        最近在開發過程當中使用oracle數據庫,在程序中進行查詢數據時遇到了「ORA-00907: 缺失右括號」的問題,可是若是直接把sql語句直接在數據庫或PL/SQL中執行時,卻又可以正常查詢,爲了解決這個問題,折騰了半天,查找了一些資料,因此就對各類致使出現「缺失右括號」的狀況進行了整理總結。行文以下。sql

1 union all中order by 致使缺失右括號

在有union all的子查詢中使用了order by,會致使缺失右括號的錯誤,事實上在有union all的子查詢中根本不必進行排序,由於聯合以後又組成了一個新的集合,以前的排序對新集合而言沒什麼用,直接查詢聯合以後的新集合而後再進行排序便可。數據庫

示例以下:oracle

select * from排序

 (開發

select COLUMN_A,COLUMN_Bio

from TABLE_EXAMPLE_Adate

order by COLUMN_Aselect

  union allsql語句

select COLUMN_A,COLUMN_Bnio

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 建立表時表中字段有關鍵字

示例以下:

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 建立主外鍵約束時外鍵類型跟主鍵類型不徹底一致

主外鍵類型不徹底一致時也會報缺失右括號的錯誤

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 字段名缺乏雙引號

若是在建立表時,表字段名所有是大寫,則不存在此問題

相關文章
相關標籤/搜索