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-01008:バインドされていない変数があります。

今日も今日とて、ORA-01008のエラーに悩まされる。 無慈悲に「バインドされていない変数があります。」ってメッセージは出してくれるんだけど、ビンゴの位置は教えてくれないわけで・・・ 何度目だろう・ …

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

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

[ORACLE]指定日付の月末を取得する

LAST_DAYで月末を取得する LAST_DAYを使います。 実際、仕様で、ある項目には月末を入力させるとか、翌月1日を指定するとかいうのが指定されたりします。 細かく計算してると正直面倒くさいです …

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

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

[ORACLE]Oracleに接続できない時に確認すること

Oracleを新しくインストールした時に、中々接続できなかったので、その時に確認しておくべき事項のまとめ。 少なくとも、これは先にやっておいた方がいいこととか。 前提条件 前提と書くとものものしいけど …


カテゴリー