第8章 JDBC エスケープ

目次

LIKEエスケープ文字用のエスケープ
外部結合用のエスケープ
日付/時刻エスケープ
エスケープされたスカラ関数

JDBC仕様では、(ODBC仕様と同様に)ベンダ固有のSQLが特定のRDBMSの機能を必要とするという実情を認知しています。 複数のデータベース製品を跨り、かつ、移植性のあるJDBCアプリケーションの作成を補助するために、開発者が実行したいコマンドを汎用的に指定できるように、特殊なエスケープ構文が使用されます。 JDBCドライバはこうしたエスケープシーケンスを特定のデータベース固有の構文に変換します。 詳細はJDBC技術ガイド(Sun™ JRE文書に付属します)の4.1.5節およびJDBC 3.0仕様の13.4節を参照してください。

Statement.setEscapeProcessing(false)を使用して、こうしたエスケープに関するSQL文の解析を無効にすることができます。

Connection.nativeSQL(String sql)は、エスケープの処理に関する別の方法を提供します。 これは、与えられたSQLをPostgreSQL™バックエンドに適したSQLに変換します。

例 8.1. JDBCエスケープの使用

JDBCエスケープを使用するには、単に日付/時刻リテラル値や外部結合、関数をJDBCエスケープ構文で置き換えたSQLを書くだけです。 以下に例を示します。

ResultSet rs = st.executeQuery("SELECT {fn week({d '2005-01-24'})}");
を移植性を高めたものを次に示します。
ResultSet rs = st.executeQuery("SELECT extract(week from DATE '2005-01-24')");

LIKEエスケープ文字用のエスケープ

文字列比較(LIKEによる)内でワイルドカード文字('%'および'_')を保護するためにどの文字をエスケープ文字とするかを、{escape 'escape-character'}というエスケープを追加することで指定することができます。 ドライバは比較式の終端でのみこれをサポートします。

例えば、'|' を'_'を保護するためのエスケープ文字として使用して、文字列を比較することができます。

rs = stmt.executeQuery("select str2 from comparisontest where str1 like '|_abcd' {escape '|'} ");