このすみノート

Webエンジニアが技術や趣味を書くブログです。

Oracleデータベースを採用する場合のSQLコーディング規約について

業務でOracleデータベースを使う必要があり、しばらくOracleを試用していたのですが、Oracleには特有のクセがあることがわかりました。

そこで、Oracleデータベースの特性にあったSQLコーディング規約を採用することにしました。

SQLコーディング規約(Oracle)

結論としては、フューチャー株式会社様のSQLコーディング規約(Oracle)を、ベースコーディング規約として採用することにしました。

一部をカスタマイズして採用しようと考えております。

future-architect.github.io

SQL中のインデントは、Javaコーディング規約にあわせて半角スペースではなくタブ文字とする。

プログラミング言語でJavaを使う予定はないため、ここは半角スペースに読み替えます。

横は80文字を目安に改行する

「80文字は短くないか?」と最初思ったのですが、長いSQLを抑制する効果もありそうな気がしてきたため、取り急ぎそのままにしました。。

外来語に関しては、原語の短縮形を使用する。短縮形が存在しない場合には、母音を抜かして表記する。

これは採用しないことにし、短縮形の利用は必要最小限にしました。

検索条件で=(等号)を使用できる場合は必ず使用する

A=1 or A=2とする方がA>0 and A<3などと記述するのよりパフォーマンス上優位な場合が多い。
これは A にインデックスがある場合、=であれば、インデックスが有効に使われるためである。

恥ずかしながら、ANDよりORのほうがパフォーマンスが良くなるパターンはあまり考えたことなかったです。 自分の場合、あくまでこのパターンでは A IN (1, 2) と書くかもしれない?

SELECT FOR UPDATEはNO WAITまたは「WAIT秒数指定」を必ず付ける。

NO WAITは厳しすぎるので、ある程度のWAIT秒数は許容したいと考えます。

予約語以外に対しても、予約語と同様に大文字を使用する。(例 : オブジェクト名、カラム名 等)

個人的には、予約語以外も大文字という規約が、本規約最大の特徴なのではないかと思いました。 大文字を使えば、Oracleのカラム名・テーブル名ダブルクオーテーション問題が軽減できそうです。

stackoverflow.com

CREATE TABLE my_table( 
  col1 number,
  col2 number
)

-- you can

SELECT * FROM my_table
SELECT * FROM MY_TABLE
SELECT * FROM My_Table
SELECT * FROM "MY_TABLE"

-- but something like

SELECT * FROM "my_table" 

-- will fail.

ORMは自動でテーブル名をダブルクオートで括ったりするのですが、テーブル名が小文字だと will fail パターンにハマります。 私も見事にハマったのですが、これはOracle特有の挙動なのかもしれません。

あとがき

まだ私はOracle見習い程度のレベル感なのですが、ORACLE MASTER資格に興味が出てきました。

Oracleの特性にもっと詳しくなりたいのであれば、資格勉強で体系的に学んでみるのはありかもしれません。