🐡

Oracle初心者が最初に知りたかったこと(随時更新予定)

2022/02/03に公開

概要

配属された部署で、使用する DB が Oracle でした。
RDB は MySQL と PostgreSQL を使用した経験があったので、なんとかなると思ったのですが、意外と癖が強く慣れるまで時間がかかったり想定した挙動と異なったりしていました。
現場でなれようと思いましたが、体系的に学ぶことも重要だと考えて Oracle MASTER Silver SQL を取得しました。
その経験も含めて、「最初に説明してほしかった」「もっと早く知っていれば」「これってほかの RDB にはないのか」みたいなことをまとめていきます。
といっても Oracle を使用してから 1 年もたっていないので、経験を重ねて気がついたことを随時更新予定です。
また、誤った情報を発信している可能性もあるので、間違いを発見した方はコメントをお願いします。

Oracle MASTER Silver SQL の合格体験記は以下のページになります。

https://zenn.dev/msksgm/articles/20220105-oracle-silver-sql

知りたかったこと

Oracle は自動コミットされない

MySQL、PostgreSQL と違って、自動コミットされません。
変更を反映したかったら、COMMITを実行しましょう。

sql* plus が正常に切断されると自動コミットされる。

sql* plus をつかって接続した状態で、exit;を実行したり ctrl+d を押下すると、正常終了のため自動コミットされます。
exit;exit commit;と同じ意味です。
ロールバックが必須なときに切断してしまうと、コミットされてしまいます。
SQL を間違えて実行しても、ctrl+d を押下せずに落ち着いてrollback;を実行しましょう。
Oracle 12c 以降では、自動コミットされないようにできるので、自動コミットを避けたい重要な作業のときには設定を変えましょう。

sql developer は早くインストールしよう

他の DB クライアントアプリケーションでも問題はありませんが、こだわりがなければ Oracle 社が提供している sql developer を使用しましょう。
SQL の記述コストが下がります。
Excel、csv、tsv に書き出しもできるので共有しやすくなります。

シングルクオート(')は文字列、ダブルクオート(")は列別名

よくやる間違いですが、文字列を入力するときにはシングルクオートを使います。
ダブルクオートも用途があって、列別名になります。
意識しないと間違えるので、覚えましょう。

スキーマを指定せずにテーブルを選択すると、ログインユーザー名になる

タイトルの通りです。
たとえばTEST_USERという名前でログインして、SELECT * FROM TEST_TABLE;と選択します。
そのとき、暗黙的にSELECT * FROM TEST_USER.TEST_TABLE;と選択されています。
事前環境などの共用で使うテーブルを選択するときにはスキーマ(ex: SHARED)を選択する必要があります。
ですので、SELECT * FROM SHARED.TEST_TABLE;というふうに実行します。

空文字('')は NULL

Oracle では、空文字は NULL です。
IS NULL で WHERE 句で検索ができたり、NULL なのに文字列の連結ができたりします。
慣れましょう。

日付時刻の比較はTO_CHAR()を使う

日付と文字列の比較で暗黙的な変換ができますが、問題が起きやすいです。
比較するときにはTO_CHAR(DATE型, 'YYYY-MM-DD')などで明示的に変換しましょう。

置換変数(&&&)を使おう

Oracle では置換変数(実行すると変数の入力を促される)が使えます。
少量のデータであってもタイポを減らすことができます。
他人に SQL を共有するときにも「こことここは書き直してね」とか伝えずに済むので、便利です。

環境変数(特にNLS_DATE_FORMATNLS_LANG)を意識する

Oracle の環境変数は意識しましょう。
基本的に OS の時刻に依存するはずです。
想定していない時刻に挿入されていたり、見慣れない表示がされたりして焦る前に環境変数を確認しましょう。

オートインクリメントにはSEQUENCEを使う(使ってもよい)

Oracle にはテーブルの制約によるオートインクリメントのほかにSEQUENCEによって、オートインクリメントを実現できます。
変数宣言して外部表の外部キーに挿入が容易になり、デバッグにも便利なので自分はよくつかいます。
ただ、Oracle Database 12c からオートインクリメントの機能が追加されたため、RDB の流れとしてシーケンスは使わない機能の可能性があります。

Oracle 独自の記法

上記で説明したように、Oracle には独自の記法が数多くあります。
Oracle を採用している現場では割と使用されていると考えています。
自分は、(+)、シーキケンス、置換変数(&&&)、BULK INSERT やユーザー定義の関数を使っています。
あまり使いませんが、ほかにはMERGE、マルチテーブル・インサートなどがあります。
すでに現場で使用されているスクリプトから学ぶのもよいですが、「ほかの DB で使えないな」となったり「Oracle にはこんな便利な関数があったなんて」となるまえに一通り学習しましょう。

DBA_ALL_USER_はデータディクショナリービュー

DBA_ALL_USER_はデータディクショナリービューの分類です。
データディクショナリビューは、データディクショナリと呼ばれる Oracle 内部の管理情報を格納している情報のことです。
具体的には、DBA_TABLESALL_TABLESUSER_TABESでは、表の情報を確認できます。
それぞれ確認できる情報が異なり以下のようになります。

ビュー名の先頭 説明
DBA_ データベース全体の管理情報が表示される。権限を持つユーザーのみがアクセス可能
ALL_ 問い合わせを実行したユーザーがアクセスできる範囲の管理情報が表示される
USER_ 問い合わせを実行したユーザーが所有する範囲の管理情報が表示される

表の確認方法をググったら、突然でてくることがあります。
意味も理解しましょう。

まとめ

初心者のときに優先して知りたかったことをまとめました。
これらを知るだけでも、とっつきやすくなるのではないでしょうか。
今後も更新をしていく予定です。
誤りがあればコメントのほどお願いします。

Discussion