Oracleで「ORA-00906: 左カッコがありません。」のエラーが出た時の対処法

投稿日:

はい。

そろそろ、上司の無茶目な仕様変更にも折り合いをつけて行きたいSEっぽいことをやってる人です。

前にも書いたかもしれないけど、また、どハマリしたOracleのエラーについて。

エラーの内容が全てじゃないよという話。

 

 

右カッコ「(」はある。足りてるのに「ORA-00906: 左カッコがありません。」とエラーになる。

原因は様々ですが、「ORA-00906: 左カッコがありません。」というエラーに悩まされたことのある人は多いはず。

きっと。

今回実行したSQLはこちら。


create table table_01 (
col001 VARCHAR2
, col002 VARCHAR2 default ' ' not null
, col003 VARCHAR2 default ' ' not null
, constraint table_01_PKC primary key (col001)
) ;

見事にエラーになります。

で、このエラー、カッコが無いという理由以外でも出るみたいです。

「ORA-00907: 右カッコがありません。」 というエラーもある。

ORA-00907: 右カッコがありません。」っていうエラーも出ることがあります。

きっと、似てるはず。

こちらのサイトをみたところ

とりあえず目を皿のようにして SQL文を舐めるように見直したのですが、何度数えなおしてもカッコの数は合ってます。あるえ?

とはいえ、受け付けてくれないのでは先に勧めないので、Webで検索してみたところ、なんとこのメッセージ、右カッコが無い場合以外でも出るみたいじゃないですか!

例えば、

  • DEFAULT句が NOT NULL の後にある
  • 不要な箇所にカンマが入っている
  • カラムの型の桁数を指定しない
  • ON とか AND が正しくない使われ方をしている
  • CASE文の中で WHEN が抜けている
  • 副問い合わせに order by が入っている
  • クォーテーションが正しく使われていない

などなど。カッコ関係ないじゃん!

引用:Oracleはカッコがあっても 「ORA-00907: 右カッコがありません。」

 

マジか\(^o^)/

カッコ関係ないじゃん!

画面を殴りたくなりましたw

もう一度、SQLを見直してみる


create table table_01 (
col001 VARCHAR2
, col002 VARCHAR2 default ' ' not null
, col003 VARCHAR2 default ' ' not null
, constraint table_01_PKC primary key (col001)
) ;

知ってる人は気づくけど、知らない人は気づくまでに時間がかかる罠・・・

VARCHAR2には、バイト数か文字数を指定する必要がありましたw

正しくは、


create table table_01 (
col001 VARCHAR2(20)
, col002 VARCHAR2(255) default ' ' not null
, col003 VARCHAR2(255) default ' ' not null
, constraint table_01_PKC primary key (col001)
) ;

確かに、左カッコといえば左カッコだけど、それなら、VARCHAR2で定義が不足してるとか表示してくれた方が分かりやすかったかな・・・と。

普段、エディタ経由でDDLとか作成しているので、エラーに気づきにくい?

普段、A5Mk2というエディタでER図を作ったり、SQLを実行したりしてます。

A5Mk2はこちら

SQL Developerで言う、クエリー・ビルダーですかね。

クエリー・ビルダーで表の作成を行うと

DDLの作成時に、VARCHAR2の後ろに「()」と付いていています。

そして、OKボタンをクリックすると、エラーになりますw

ということで、サイズを指定してから、OKボタンをクリックすると、テーブルが無事作成されました。

 

A5Mk2との違いは、VARCHAR2の後ろに「()」が追加されるかされないかだけ。

ぶっちゃけ気づかなかったw

そこは、まぁSQL DeveloperはOracleが提供してるので、そういうところにも手が届くんだろうね。

っていうか、A5Mk2にそこまで求めてはいけないので、自分で気をつけないといけない。

VARCHAR2とCHARの違いとかありますが、それはまた別の話なので詳細は省きます。

まとめ

  • Oracleのエラーは、全てが全て正しいことを表示しているわけじゃない
  • カッコの数とかを簡単にチェックしたら、それ以外の構文の可能性を検討する

エディタに頼ってばかりではいけないなと思うけど、省力化のためのエディタなので、もうちょっとOracleというか、Oracleの勉強しとかないとマズイな・・・

まだまだ勉強が足りないw







-ORACLE
-,

関連記事

ORACLEでORA-01861: リテラルが書式文字列と一致しません

ORA-01861: リテラルが書式文字列と一致しません このエラー、ぶっちゃけ、意味が分からないところでもある。 日付の指定時に発生してて、原因が判明するまでに結構回り道をしました。 ネットで検索し …

Oracleで複数レコードを更新する方法

UPDATE文で、複数のレコードを一回のトランザクション内で更新する必要に迫られました。 基本的に、今まで使ってきたUPDATE文では、 UPDATE tableA set COL1 = 1 ,COL …

Oracle11gでパスワードの有効期限を変更する

先日のOra-28001ですが、他のユーザーも同様になってましたw 当然ですね・・・ 日本の中心付近で仕様変更と闘うSE日記Oracleで「Ora-28001:the password has exp …

ORACLEでSPOOL処理の高速化を試す

ORACLEでSPOOL処理の高速化を考えてみた 事の発端は、お客様のお怒りでした・・・ なんで、お客さんに最新版のリリース時には、必ずスキーマ間の比較をすることを徹底しろと言われてしまったと。 まぁ …

no image

OracleでLISTAGG関数を使ったら、世界が変わった話。

11gR2からGROUP_CONCAT(複数行をまとめて1列に)が可能に http://d.hatena.ne.jp/kkz_tech/20150311/1426048592 日本の中心付近で仕様変更 …


カテゴリー