Jdbc-stored-procedure

提供:Dev Guides
移動先:案内検索

JDBC-ストアドプロシージャ

link:/jdbc/jdbc-statements [JDBC-Statements]の章を説明しながら、JDBCで*ストアドプロシージャ*を使用する方法を学びました。 この章はそのセクションに似ていますが、JDBC SQLエスケープ構文に関する追加情報を提供します。

ConnectionオブジェクトがStatementおよびPreparedStatementオブジェクトを作成するように、CallableStatementオブジェクトも作成します。これは、データベースストアドプロシージャの呼び出しを実行するために使用されます。

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;
  • 注:*上記のストアドプロシージャは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 ;

パラメーターには、IN、OUT、およびINOUTの3つのタイプがあります。 PreparedStatementオブジェクトは、INパラメーターのみを使用します。 CallableStatementオブジェクトは3つすべてを使用できます。

ここにそれぞれの定義があります-

Parameter Description
IN A parameter whose value is unknown when the SQL statement is created. You bind values to IN parameters with the setXXX() methods.
OUT A parameter whose value is supplied by the SQL statement it returns. You retrieve values from the OUT parameters with the getXXX() methods.
INOUT A parameter that provides both input and output values. You bind variables with the setXXX() methods and retrieve values with the getXXX() methods.

次のコードスニペットは、* 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データ型にキャストします。

CallableStatementオブジェクトを閉じる

他のStatementオブジェクトを閉じるのと同じように、同じ理由でCallableStatementオブジェクトも閉じる必要があります。

close()メソッドを単純に呼び出すと、ジョブが実行されます。 最初にConnectionオブジェクトを閉じると、CallableStatementオブジェクトも閉じます。 ただし、適切にクリーンアップされるように、CallableStatementオブジェクトを常に明示的に閉じる必要があります。

CallableStatement cstmt = null;
try {
   String SQL = "{call getEmpName (?, ?)}";
   cstmt = conn.prepareCall (SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   cstmt.close();
}

study私たちは、リンク:/jdbc/callablestatement-object-example [Callable-Example Code]で詳細を調査しました。

JDBC SQLエスケープ構文

エスケープ構文を使用すると、標準のJDBCメソッドとプロパティを使用して、使用できないデータベース固有の機能を柔軟に使用できます。

一般的なSQLエスケープ構文の形式は次のとおりです-

{keyword 'parameters'}

以下は、JDBCプログラミングの実行中に非常に役立つ次のエスケープシーケンスです。

d、t、tsキーワード

これらは、日付、時刻、およびタイムスタンプのリテラルを識別するのに役立ちます。 ご存知のように、2つのDBMSが同じ方法で時刻と日付を表すことはありません。 このエスケープ構文は、ターゲットデータベースの形式で日付または時刻をレンダリングするようにドライバーに指示します。 例-

{d 'yyyy-mm-dd'}

ここで、yyyy =年、mm =月。 dd =日付。 この構文\ {d '2009-09-03'}の使用は、2009年3月9日です。

これは、テーブルに日付を挿入する方法を示す簡単な例です-

//Create a Statement object
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つの構文のいずれかを使用できます。 t または ts -

{t 'hh:mm:ss'}

ここで、hh =時間。 mm =分; ss =秒。 この構文を使用すると、\ {t '13:30:29 '}は午後1:30:29です。

{ts 'yyyy-mm-dd hh:mm:ss'}

これは、タイムスタンプを表す「d」と「t」の上記2つの構文を組み合わせた構文です。

エスケープキーワード

このキーワードは、LIKE句で使用されるエスケープ文字を識別します。 0個以上の文字と一致するSQLワイルドカード%を使用する場合に役立ちます。 たとえば-

String sql = "SELECT symbol FROM MathSymbols
              WHERE symbol LIKE '\%' {escape '\'}";
stmt.execute(sql);

バックスラッシュ(\)をエスケープ文字として使用する場合、バックスラッシュもJavaエスケープ文字でもあるため、Java文字列リテラルで2つのバックスラッシュ文字を使用する必要があります。

fnキーワード

このキーワードは、DBMSで使用されるスカラー関数を表します。 たとえば、SQL関数_length_を使用して、文字列の長さを取得できます-

{fn length('Hello World')}

これは、文字列「Hello World」の長さである11を返します。

キーワードを呼び出す

このキーワードは、ストアドプロシージャを呼び出すために使用されます。 たとえば、INパラメータを必要とするストアドプロシージャの場合、次の構文を使用します-

{call my_procedure(?)};

INパラメータを必要とし、OUTパラメータを返すストアドプロシージャの場合、次の構文を使用します-

{? = call my_procedure(?)};

ojキーワード

このキーワードは、外部結合を示すために使用されます。 構文は次のとおりです-

{oj outer-join}

where outer-join = table \ {LEFT | RIGHT | FULL} OUTERJOIN \ {table | search-conditionのouter-join}。 たとえば-

String sql = "SELECT Employees
              FROM {oj ThisTable RIGHT
              OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);