SQL
昨日の記事に続き、今日もSQLネタ。さて、あるテーブルにある行を検索する際に検索条件が外部キーで参照した別テーブルの列にあり、かつそのテーブルの値をselectしない場合、 そのようなSQLは結合もしくはexists句を使う2パターンで表現できる。今回はこの2…
SQLを書いていて、あるグループごとにある項目を集計して最大値を持つ行だけを検索したいときがある。 これまではあまり気にせずにgroup byと集計関数MAXを使ったサブクエリを検索条件に使うことで求めていたが、 パフォーマンスがよくないことがあり、今回…
久々にOracle Databaseの記事を。 Oracle Databaseのトリガーを使っていて、トリガー発生の原因となったイベントに関する情報を取得したいということがあった。例えば、CREATE TABLE文などのDDL発行を起因するシステム・トリガー内で、作成しようとしたテー…
Oracle PL/SQLではbase64エンコード/デコードは標準のutl_encodeというパッケージにてbase64_encodeやbase64_decode関数で簡単にエンコード/デコードすることができる。 ただし、base64は本質的にバイナリ(バイト列)とテキストの可逆変換なので、RAW型のデー…
シェルスクリプトでSQL*PLUSを実行して、その結果をシェル変数に格納したいことがよくある。テーブルのデータ件数やマスタテーブルから特定のデータを引っ張りたいときなどなど。 こういうとき、sqlplusコマンドに対しSQLコードをヒアドキュメントで囲って渡…
実際のテーブルは存在しないけど、プログラム上で二次元配列構造を定義し、 それをテーブルのように扱うために表関数(table()関数)というものがある。 PL/SQLプログラム上で配列の配列を定義する場合にも使えるので、使用方法をまとめてみた。今回は例として…
Oracle DBにSQLを投げて検索結果をCSVやTSV等のフォーマットで標準出力してくれるchcsvというツールがある。 Pro*Cのソースからコンパイルが必要なため、そのときの手順をまとめてみる。 環境はCentOS6.5で、Oracle Database11gR2が入っている。公式サイト =…
PL/SQLでアプリを書いていると、たまにOSコマンドやシェルスクリプトを実行したくなる。 まあOracle DB上からJavaを実行することはできるので、どうにかできるかなあとは思っていると、 すでにPLSQL_OSCOMMANDなるものがあるらしい。Oracle PL/SQL executing…
SQLの実行計画を見るためによく使うDBMS_XPLAN.display。 ここに'OUTLINE'または'ADVANCED'オプションを渡すと、実際に付与されるヒント句が表示されるようになる。 これは'ALL'オプションでは表示されず、ドキュメントにも記載がないが、以下の本に詳細が書…
SQLの外部結合とスカラサブクエリの等価性について調べてみたので結果をまとめてみる。 スカラサブクエリとは スカラサブクエリとはスカラ値(つまり単一値)を返すクエリのことである。 SQLにおけるスカラ値を返すとは、単一列の値を1行だけ返すようなクエリ…