English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
学習中JDBC-文一方で、JDBCでストレージプロシージャの使用方法を学びました。本章では、その一部と似ていますが、JDBC SQLエスケープシンタックスに関するもっと多くの情報を提供します。
ConnectionオブジェクトがStatementやPreparedStatementオブジェクトを作成するように、CallableStatementオブジェクトも作成され、データベースのストレージプロシージャの呼び出しに使用されます。
以下のOracleストレージプロシージャを実行する必要があると仮定します-
CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END;
NOTE: 上記のストレージプロシージャはOracle用に書かれていますが、私たちはMySQLデータベースを使用しているため、以下のようにMySQL用の同じストレージプロシージャを書いて、EMPデータベースに作成しましょう。-
DELIMITER $$ DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$ CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255)) BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END $$ DELIMITER ;
存在するパラメータの種類は3種類です:IN、OUT、およびINOUT。PreparedStatementオブジェクトはINパラメータのみを使用します。CallableStatementオブジェクトはこれらすべてのパラメータを使用できます。
これは各の定義です-
範囲 | 説明 |
---|---|
IN | SQL文を作成する際に値がまだ不明なパラメータ。setXXX()メソッドを使用してINパラメータに値をバインドします。 |
OUT | 値は返されるSQL文のパラメータによって提供されます。OUTパラメータからgetXXX()メソッドを使用して値を取得します。 |
INOUT | 入力および出力値の両方を提供するパラメータ。setXXX()メソッドを使用して変数をバインドし、getXXX()メソッドを使用して値を取得できます。 |
以下のコードスライスは、前のストレージプロシージャに基づいてこのメソッドを使用してオブジェクトをインスタンス化する方法を示します。-Connection.prepareCall()CallableStatement
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt =conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
文字列変数SQLは、パラメータプレースホルダを持つストレージプロシージャを表します。
CallableStatementオブジェクトを使用するのはPreparedStatementオブジェクトと非常に似ています。すべてのパラメータに値をバインドする前にこのステートメントを実行する必要があります。それをしないとSQLExceptionが発生します。
INパラメータがある場合、PreparedStatementオブジェクトに対して適用される同じルールと技術に従います。バインドされたJavaデータ型に対応するsetXXX()メソッドを使用します。
OUTおよびINOUTパラメータを使用する場合、追加のCallableStatementメソッドregisterOutParameter()を使用する必要があります。registerOutParameter()メソッドは、予期されるストレージプロシージャから返されるデータ型にJDBCデータ型をバインドします。
ストレージプロシージャを呼び出した後、適切なgetXXX()メソッドを使用してOUTパラメータから値を取得できます。このメソッドは取得したSQLデータ型の値をJavaデータ型に変換します。
他のStatementオブジェクトと同様に、同じ理由からCallableStatementオブジェクトを閉じる必要があります。
close()メソッドを呼び出すだけで十分です。Connectionオブジェクトを先に閉じると、CallableStatementオブジェクトも閉じられますが、常にCallableStatementオブジェクトを明示的に閉じることを推奨します。正確なクリーンアップを確保するためです。
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt =conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { cstmt.close(); }
私たちは以下を研究しました。可呼び出し例コードでは詳細について研究しました。
エスケープ文法は、標準のJDBCメソッドや属性で使用できないデータベース固有の機能を柔軟に使用できるようにします。
一般的なSQLエスケープ文法のフォーマットは以下の通りです。-
{keyword 'parameters'}
以下のエスケープシーケンスは、JDBCプログラミングの実行中に非常に役立ちます。-
これらは日付、時間、タイムスタンプのテキストを識別するのに役立ちます。ご存知の通り、2つのdbmsは時間と日付の表示方法が異なります。このエスケープ文法は、ドライバーにターゲットデータベースのフォーマットで日付や時間を表示するように指示します。例えば:
{d 'yyyy-mm-dd'}
その中でyyyy =年、mm =月;dd =日です。この文法{d'2009-09-03は}2009年3月9日。
これはテーブルに日付を挿入する方法を示すシンプルな例です。-
//Statementオブジェクトを作成します。 stmt = conn.createStatement(); //Insert data ==> ID, First Name, Last Name, DOB String sql="INSERT INTO STUDENTS VALUES" + "(100,'Zara','Ali', {d '2001-12-16'})"; stmt.executeUpdate(sql);
同様に、以下の2つの文法のうちの1つを使用することができます。tまたはts:
{t 'hh:mm:ss'}
その中でhh =時間;mm=分;ss =秒です。この文法{t13:30:29は}1:30:29 PM。
{ts 'yyyy-mm-dd hh:mm:ss
これは上記の2つの文法を組み合わせた文法で、'd'と't'はタイムスタンプを表します。
LIKE 子句で使用されるエスケープシンボルを示すキーワードです。SQLのワイルドカードマッチング演算子%を使用する際に非常に役立ちます。この演算子は、0個または複数の文字をマッチングします。例えば:
String sql = "SELECT symbol FROM MathSymbols" WHERE symbol LIKE '\%' {escape '\'}"; stmt.execute(sql);
アンダースコア文字(\)を使用するエスケープシンボルとして、Java String文字列リテラルでは2つのアンダースコア文字を使用する必要があります。なぜなら、アンダースコア文字もJavaのエスケープシンボルだからです。
このキーワードはDBMSで使用されるスカラーファンクションを示します。例えば、SQL関数を使用できますlength文字列の長さを取得するために-
{fn length('Hello World')}
これは以下を返します11、つまり「Hello World」文字列の長さです。
ストレージプロシージャを呼び出すためにこのキーワードを使用します。例えば、INパラメータが必要なストレージプロシージャに対して、以下の構文を使用します-
{call my_procedure(?)};
INパラメータが必要でOUTパラメータを返すストレージプロシージャに対して、以下の構文を使用してください-
{? = call my_procedure(?)};
外部結合を示すためにこのキーワードを使用します。構文は以下の通りです-
{oj outer-join}
外部結合=テーブル{LEFT | RIGHT | FULL} OUTER JOIN {テーブル | 検索条件。例えば-
String sql = "SELECT Employees FROM {oj ThisTable RIGHT OUTER JOIN ThatTable ON id = '100'}"; stmt.execute(sql);