カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまにRuby on Railsなども。

SQL

SQL テーブル参照先の条件句 JOIN vs EXISTS

昨日の記事に続き、今日もSQLネタ。さて、あるテーブルにある行を検索する際に検索条件が外部キーで参照した別テーブルの列にあり、かつそのテーブルの値をselectしない場合、 そのようなSQLは結合もしくはexists句を使う2パターンで表現できる。今回はこの2…

SQL グループごとの最大値を持つ行を取得するときは分析関数MAXを使う

SQLを書いていて、あるグループごとにある項目を集計して最大値を持つ行だけを検索したいときがある。 これまではあまり気にせずにgroup byと集計関数MAXを使ったサブクエリを検索条件に使うことで求めていたが、 パフォーマンスがよくないことがあり、今回…

Oracle トリガーイベント時にDDL操作情報を取得する

久々にOracle Databaseの記事を。 Oracle Databaseのトリガーを使っていて、トリガー発生の原因となったイベントに関する情報を取得したいということがあった。例えば、CREATE TABLE文などのDDL発行を起因するシステム・トリガー内で、作成しようとしたテー…

PL/SQLで文字列をbase64でエンコード/デコードする方法

Oracle PL/SQLではbase64エンコード/デコードは標準のutl_encodeというパッケージにてbase64_encodeやbase64_decode関数で簡単にエンコード/デコードすることができる。 ただし、base64は本質的にバイナリ(バイト列)とテキストの可逆変換なので、RAW型のデー…

bash/cshでSQL*PLUS実行結果をシェル変数に格納する方法

シェルスクリプトでSQL*PLUSを実行して、その結果をシェル変数に格納したいことがよくある。テーブルのデータ件数やマスタテーブルから特定のデータを引っ張りたいときなどなど。 こういうとき、sqlplusコマンドに対しSQLコードをヒアドキュメントで囲って渡…

Oracle 表関数(table関数)を使ってテーブルオブジェクトを作成する

実際のテーブルは存在しないけど、プログラム上で二次元配列構造を定義し、 それをテーブルのように扱うために表関数(table()関数)というものがある。 PL/SQLプログラム上で配列の配列を定義する場合にも使えるので、使用方法をまとめてみた。今回は例として…

chcsvをコンパイルしたときのメモ

Oracle DBにSQLを投げて検索結果をCSVやTSV等のフォーマットで標準出力してくれるchcsvというツールがある。 Pro*Cのソースからコンパイルが必要なため、そのときの手順をまとめてみる。 環境はCentOS6.5で、Oracle Database11gR2が入っている。公式サイト =…

PL/SQLからOSコマンド・シェルスクリプトを実行する

PL/SQLでアプリを書いていると、たまにOSコマンドやシェルスクリプトを実行したくなる。 まあOracle DB上からJavaを実行することはできるので、どうにかできるかなあとは思っていると、 すでにPLSQL_OSCOMMANDなるものがあるらしい。Oracle PL/SQL executing…

Oracle SQL実行計画でヒントの一覧を表示するためのDBMS_XPLAN.display(format=>'ADVANCED')オプションが便利

SQLの実行計画を見るためによく使うDBMS_XPLAN.display。 ここに'OUTLINE'または'ADVANCED'オプションを渡すと、実際に付与されるヒント句が表示されるようになる。 これは'ALL'オプションでは表示されず、ドキュメントにも記載がないが、以下の本に詳細が書…

SQL 外部結合と等価なスカラサブクエリについて

SQLの外部結合とスカラサブクエリの等価性について調べてみたので結果をまとめてみる。 スカラサブクエリとは スカラサブクエリとはスカラ値(つまり単一値)を返すクエリのことである。 SQLにおけるスカラ値を返すとは、単一列の値を1行だけ返すようなクエリ…