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]指定日付の月末を取得する

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

何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

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

ORACLEのMERGE INTOで、UPDATEは出来るのに、INSERTできない

最近、Oracleのエラーの話しか書いてない気がするw     便利というか、トランザクション内の処理も1つで済むので、MERGE INTO文を使うことがあります。 実際、 新規デ …

partition by を使って、ORACLEで、グループ毎に1行だけ取得する。

グループ単位で一番小さいとか、一番大きいとかだけなら、MinやMaxを使って外部結合で対応できるんだけど、1番目2番目3番目を1列で取得しなきゃいけない状態になったので、調べて解決。 「partiti …

ORACLEでCASE文を使用した時にORA-00932のエラーが出る

割と悩んだ・・・ 原因は、CASE文で使用している項目のデータ型が異なるのが原因みたいだけど、正直、ぴんと来てない現実w select case name when ‘A’ then ‘あ’ when …


カテゴリー