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 Database Bronzeの勉強を始めました。

業務でOracleを使ってます。 DBへの接続と簡単なSQLの確認ぐらいだったら、SQLDeveloperとかのツールを使わずにSQLPlusだけで済ませちゃう人も多いのかな? あとは、SQLのバッチ …

[ORACLE]最初の有効値を返すCOALESCE・・・読み方分からねぇw

知らなかったら、多分CASEとかで判定してた。 まぁ、人の書いたSQLは勉強になるよねって話・・・じゃないなw 事の発端は、今のプロジェクトで別の人が作った画面の修正をやることになったこと。 その人は …

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

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

[ORACLE]SQLのIN句にパラメータを適用する方法

カンマ区切りの文字列を取得した理由 こないだの続きです。 日本の中心付近で仕様変更と闘うSE日記[C#]リストをカンマ区切りの文字列で出力するhttp://ht-jp.net/blog/pc/c/c- …

[ORACLE]統計更新を強制的にする

Oracleの統計情報の更新方法 頻度はそんなに無いというか、先日、トラブル対応時に必要に迫られたので・・・ 通常は、Oracleの統計情報は1日1回更新されるらしいんだけど、夜とかになるみたい。 多 …


カテゴリー