はい。
そろそろ、上司の無茶目な仕様変更にも折り合いをつけて行きたい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