この節には、XDSイベントにSQLを埋め込む場合に役立つ情報が含まれています。
すべての例では、次のindirect.usrテーブルを参照します。
CREATE TABLE indirect.usr ( idu INTEGER NOT NULL, fname VARCHAR2(64), lname VARCHAR2(64),
CONSTRAINT pk_usr_idu PRIMARY KEY(idu) );
埋め込みSQLを使用すると、SQLステートメントをXDS形式のXMLドキュメントに埋め込むことができます。埋め込みSQLステートメントは、XDSイベントと組み合わせて、またはスタンドアロンで使用できます。埋め込みSQLステートメントがスタンドアロンで使用される場合、埋め込みSQLの処理では、ドライバがターゲットデータベースのテーブル/ビューについて認識していなくてもかまいません。したがって、ドライバは、schema-unawareモードで実行できます。同期フィルタを参照してください。埋め込みSQLをスタンドアロンで使用する場合は、関連付けを手動で確立する必要があります。ドライバによって確立されることはありません。
XDSイベントと組み合わせて使用する場合、埋め込みSQLは、仮想データベーストリガとして機能できます。テーブルにデータベーストリガをインストールして特定のSQLステートメントの実行時に副次的な動作を実行できるのと同様に、埋め込みSQLは、特定のXDSイベントに対応して、データベースで副次的な動作を実行させることができます。
XDSイベントにSQLを埋め込むことによって、次を実行できます。
ユーザパスワードの設定、確認、または変更ができます。
サンプルの環境設定ファイルJDBCv2.xmlは、XDSイベントの副次的動作として、データベースユーザの作成、ユーザパスワードの管理、およびユーザ特権の管理を行う方法を示しています。データベースユーザアカウント管理を有効にするには、グローバル設定変数(GCV)user-ddlをtrueに設定します。埋め込みSQLの例は、購読者チャネルのUser DDLコマンド変換スタイルシートに含まれています。
SQLは、<jdbc:statement>および<jdbc:sql>要素を通じてXDSイベントに埋め込まれます。<jdbc:statement>要素には、1つまたは複数の<jdbc:sql>要素を含めることができます。
この節で使用するネームスペースのプリフィックスjdbcは、XMLドキュメント外で参照される場合、暗黙的にネームスペースurn:dirxml:jdbcにバインドされます。
埋め込みSQL要素および属性は、ネームスペースのプリフィックスを付けて使用する必要があります。プリフィックスがない場合、ドライバはそれらを認識しません。この節のすべての例で使用されているプリフィックスはjdbcです。実際には、ネームスペース値urn:dirxml:jdbcにバインドされていれば、プリフィックスは何でもかまいません。
次のXMLの例は、埋め込みSQL要素を使用する方法および適切にネームスペースプリフィックスを付ける方法を示します。次の例では、ネームスペース宣言およびネームスペースプリフィックスが太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = 'John'</jdbc:sql> </jdbc:statement> </input>
次のXMLの例は、<jdbc:statement>および<jdbc:sql>要素の使用法とその解釈を示します。次の例では、埋め込みSQL要素が太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = 'John'</jdbc:sql> </jdbc:statement> </input>
購読者チャネルは、<add>イベントを1つまたは複数のINSERTステートメントに解決するので、前のXMLは、次のように解決されます。
SET AUTOCOMMIT OFF INSERT INTO indirect.usr(lname)VALUES('Doe'); COMMIT; --explicit commit UPDATE indirect.usr SET fname = 'John'; COMMIT; --explicit commit
関連付けからフィールド値を解析することをユーザに要求する代わりに、購読者チャネルが埋め込みSQLステートメントでのトークンの置き換えをサポートしています。次の例では、トークンとそれが参照する値が太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <modify class-name="usr"> <association>idu=1,table=usr,schema=indirect</association> <modify-attr name="lname"> <add-value> <value>DoeRaeMe</value> </add-value> </modify-attr> </modify> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
トークンのプレースホルダは、XSLT属性値テンプレートの構文{$field-name}に準拠する必要があります。また、参照される関連付け要素は、XDSドキュメント内で<jdbc:statement>要素より前に置くか、<jdbc:statement>要素の子として存在する必要があります。または、関連付け要素を<jdbc:statement>要素の子としてコピーする代わりに、関連付け要素を含む要素のsrc-entry-idを<jdbc:statement>要素にコピーします。次の例では、両方の方法が太字で示されています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <modify class-name="usr"> <association>idu=1,table=usr,schema=indirect</association> <modify-attr name="lname"> <add-value> <value>DoeRaeMe</value> </add-value> </modify-attr> </modify> <jdbc:statement> <association>idu=1,table=usr,schema=indirect</association> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
<input xmlns:jdbc="urn:dirxml:jdbc"> <modify class-name="usr" src-entry-id="0"> <association>idu=1,table=usr,schema=indirect</association> <modify-attr name="lname"> <add-value> <value>DoeRaeMe</value> </add-value> </modify-attr> </modify> <jdbc:statement src-entry-id="0"> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
{$field-name}トークンは、関連付けの値のいずれかの命名RDN属性名を参照する必要があります。前の例では、命名属性はiduの1つだけです。
<add>イベントは、トークンを持つ埋め込みSQLステートメントより前に関連付け要素を配置する必要がない唯一のイベントです。これは、関連付けがまだ作成されていないからです。さらに、トークンを使用する埋め込みSQLステートメントは、<add>イベントの前ではなく、後に続ける必要があります。次に例を示します。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
機密情報の複写を防ぐには、{$$password}トークンを使用して、同じドキュメント内の<password>要素の直前の内容を参照できます。次の例では、パスワードトークンとそれが参照する値が太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <password>some password</password> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>CREATE USER jdoe IDENTIFIED BY {$$password}</jdbc:sql> </jdbc:statement> </input>
さらに、「アプリケーションパスワード」パラメータで{$$$driver-password}として指定されているドライバのデータベース認証パスワードも参照できます。アプリケーションパスワードを参照してください。名前付きパスワードの置換はまだサポートされていません。
関連付け要素の場合と同様に、参照されるパスワード要素は、XDSドキュメント内で、<jdbc:statement>要素より前に置くか、<jdbc:statement>要素の子として存在する必要があります。または、パスワード要素を<jdbc:statement>要素の子としてコピーする代わりに、パスワード要素を含む要素のsrc-entry-idを<jdbc:statement>要素にコピーします。次の例では、両方の方法が太字で示されています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <password>some password</password> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <password>some password</password> <jdbc:sql>CREATE USER jdoe IDENTIFIED BY {$$password}</jdbc:sql> </jdbc:statement> </input>
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr" src-entry-id="0"> <password>some password</password> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement src-entry-id="0"> <jdbc:sql>CREATE USER jdoe IDENTIFIED BY {$$password}</jdbc:sql> </jdbc:statement> </input>
データベーストリガを、それをトリガするステートメントの前または後に開始できるのと同じように、埋め込みSQLは、トリガするXDSイベントの前または後に配置できます。次の例は、SQLをXDSイベントの前または後に埋め込む方法を示します。
<input xmlns:jdbc"urn:dirxml:jdbc"> <jdbc:statement> <association>idu=1,table=usr,schema=indirect</association> <jdbc:sql>UPDATE indirect.usr SET fname = 'John' WHERE idu = {$idu}</jdbc:SQL> </jdbc:statement> <modify class-name="usr"> <association>idu=1,table=usr,schema=indirect</association> <modify-attr name="lname"> <remove-all-values/> <add-value> <value>Doe</value> </add-value> </modify-attr> </modify> </input>
このXMLは次のように解決されます。
SET AUTOCOMMIT OFF UPDATE indirect.usr SET fname = 'John' WHERE idu = 1; COMMIT; --explicit commit UPDATE indirect.usr SET lname = 'Doe' WHERE idu = 1; COMMIT; --explicit commit
<input xmlns:jdbc"urn:dirxml:jdbc"> <modify class-name="usr"> <association>idu=1,table=usr,schema=indirect</association> <modify-attr name="lname"> <remove-all-values/> <add-value> <value>Doe</value> </add-value> </modify-attr> </modify> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = 'John' WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
このXMLは次のように解決されます。
SET AUTOCOMMIT OFF UPDATE indirect.usr SET lname = 'Doe' WHERE idu = 1; COMMIT; --explicit commit UPDATE indirect.usr SET fname = 'John' WHERE idu = 1; COMMIT; --explicit commit
次の2つのカスタム属性を使用して、埋め込みSQLおよびXDSイベントを手動でグループ化することができます。
この属性には、manualおよびautoの2つの値があります。デフォルトで、対象となるXDSイベントのほとんど(<add>、<modify>、および<delete>)は、暗黙的に手動トランザクションタイプに設定されます。手動設定により、XDSイベントは、1つまたは複数のSQLステートメントで構成されたトランザクションに解決できます。
デフォルトで、埋め込みSQイベントは、自動トランザクションタイプに設定されます。DDLステートメントなど、一部のSQLステートメントは、通常、手動トランザクションに含めることができないからです。次の例では、属性が太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr" jdbc:transaction-type="auto"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
このXMLは次のように解決されます。
SET AUTOCOMMIT ON INSERT INTO indirect.usr(lname) VALUES(’Doe’); -- implicit commit UPDATE indirect.usr SET fname = ’John’ WHERE idu = 1; -- implicit commit
要素のjdbc:transaction-type属性値が、デフォルトで、または明示的にmanualに設定されていない場合、購読者チャネルは、この属性を無視します。次のXMLは、手動トランザクションの例を示します。属性は太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr" jdbc:transaction-id="0"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement jdbc:transaction-type="manual" jdbc:transaction-id="0"> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
このXMLは次のように解決されます。
SET AUTOCOMMIT OFF INSERT INTO indirect.usr(lname) VALUES('Doe’); UPDATE indirect.usr SET fname = ’John’ WHERE idu = 1; COMMIT; -- explicit commit
ステートメントのグループ化以外にも、トランザクションを使用して、データベース内のデータの整合性を維持することができます。トランザクションは、アクセスまたは変更が同時に行われないように、データをロックします。トランザクションの分離レベルによって、ロックの設定方法が決まります。通常は、ドライバが使用するデフォルトの分離レベルで十分なので、変更しないでください。
ただし、必要な場合は、カスタム属性jdbc:isolation-levelを使用して、トランザクション分離レベルを調整できます。java.sql.Connectionパラメータは、インタフェースに有効な5つの値を定義します。java.sql.Connectionを参照してください。
ドライバのデフォルトトランザクション分離レベルは、記述子ファイルによって上書きされる場合を除いて、read committedです。手動トランザクションでは、 jdbc:isolation-level属性をトランザクションの最初の要素に配置します。この属性は、それ以降の要素では無視されます。次の例では、属性が太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr" jdbc:transaction-id="0" jdbc:isolation-level="serializable"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement jdbc:transaction-type="manual" jdbc:transaction-id="0"> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
このXMLは次のように解決されます。
SET AUTOCOMMIT OFF SET TRANSACTION ISOLATION LEVEL SERIALIZABLE INSERT INTO indirect.usr(lname) VALUES(’Doe’); UPDATE indirect.usr SET fname = ’John’ WHERE idu = 1; COMMIT; -- explicit commit
購読者チャネルは、埋め込みSQLステートメントを実行しますが、その解釈はしません。JDBC 1インタフェースは、さまざまなタイプのSQLステートメントを実行するための複数のメソッドを定義します。次の表は、これらのメソッドを示します。
Table 5-24 SQLステートメントを実行するメソッド
最も単純な解決方法は、すべてのSQLステートメントをjava.sql.Statement.execute(String sql):booleanメソッドにマップする方法です。デフォルトで、購読者チャネルは、このメソッドを使用します。
一部のサードパーティ製のドライバ(特にOracle’製のJDBCドライバ)では、このメソッドが生成する結果セットの数の決定に使用されるメソッドが正しく実装されません。このため、ドライバが無限ループに陥り、CPUの使用率が高くなる可能性があります。この問題を回避するには、任意の<jdbc:statement>要素でjdbc:type属性を使用して、それに含まれるSQLステートメントを、デフォルトメソッドではなく次のメソッドにマップします。
jdbc:type属性には、updateとqueryの2つの値があります。INSERT、UPDATE、またはDELETEステートメントの場合、値をupdateに設定します。SELECTステートメントの場合、値をqueryに設定します。この属性がない場合、ドライバはすべてのSQLステートメントをデフォルトメソッドにマップします。<jdbc:statement>以外の要素に配置された場合、この属性は無視されます。
次のように指定することをお勧めします。
次のXMLは、jdbc:type 属性の例を示します。属性は太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement jdbc:type="update"> <jdbc:sql>UPDATE indirect.usr SET fname = ’John’ WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
データベースのクエリ機能を完全にサポートし、また難しいネイティブSQLクエリのXDS形式への変換を回避するために、ドライバは、ネイティブSQLクエリ処理をサポートしています。選択ステートメントは、その他のSQLステートメントとまったく同じ方法でXDSドキュメントに埋め込むことができます。
たとえば、usrテーブルに、次が含まれているとします。
次のXMLドキュメントの結果、1つの結果セットを含む出力ドキュメントが得られます。
<input xmlns:jdbc="urn:dirxml:jdbc"> <jdbc:statement jdbc:type="query"> <jdbc:sql>SELECT * FROM indirect.usr</jdbc:sql> </jdbc:statement> </input>
<output xmlns:jdbc="urn:dirxml:jdbc"> <jdbc:result-set jdbc:number-of-rows="1"> <jdbc:row jdbc:number="1"> <jdbc:column jdbc:name="idu" jdbc:position="1" jdbc:type="java.sql.Types.BIGINT <jdbc:value>l</jdbc:value> </jdbc:column> <jdbc:column jdbc:name="fname" jdbc:position="2" jdbc:type="java.sql.Types.VARCHAR> <jdbc:value>John</jdbc:value> </jdbc:column> <jdbc:column jdbc:name="lname" jdbc:position="3" jdbc:type="java.sql.Types.VARCHAR> <jdbc:value>Doe</jdbc:value> </jdbc:column> </jdbc:row> </jdbc:result-set> <status level="success"/> </output>
SQLクエリは、結果セットに行が含まれているかどうかに関係なく、常に単一の<jdbc:result-set>要素を生成します。結果セットが空の場合、jdbc:number-of-rows属性はゼロに設定されます。
ドキュメントには複数のクエリを埋め込むことができます。SQLクエリでは、同期スキーマ内の参照されるテーブル/ビューがドライバに表示できなくてもかまいません。ただし、XDSクエリでは表示できる必要があります。
一般に、データベーストリガでDDL(Data Definition Language)ステートメントを実行することはできません。これは、ほとんどのデータベースでは、DMLとDDLのトランザクションを混在させることができないからです。仮想トリガでは、このトランザクションの制限を克服はできませんが、DDLステートメントをXDSイベントの副次的動作として実行させることはできます。
次に例を示します。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>CREATE USER jdoe IDENTIFIED BY novell</jdbc:sql> </jdbc:statement> </input>
このXMLは次のように解決されます。
SET AUTOCOMMIT OFF INSERT INTO indirect.usr(fname, lname) VALUES(’John’, ’Doe’); COMMIT; -- explicit commit SET AUTOCOMMIT ON CREATE USER jdoe IDENTIFIED BY novell; -- implicit commit
jdbc:transaction-idおよびjdbc:transaction-type属性を使用してDMLおよびDDLステートメントを1つのトランザクションにまとめると、ほとんどのデータベースでトランザクションがロールバックされます。DDLステートメントは、通常、個別のトランザクションとして実行されるので、前の例のinsertステートメントが成功し、create userステートメントがロールバックされる可能性があります。
ただし、insertステートメントが失敗し、create userステートメントが成功することはありません。ドライバは、チェーンになったトランザクションの実行を、最初のトランザクションがロールバックされたところで停止します。
通常は、DMLおよびDDLステートメントを1つのトランザクションに混在させることはできないので、1つのイベントを1つ以上のトランザクションで構成することができます。jdbc:op-idおよびjdbc:op-typeを使用すると、複数のトランザクションを1つの論理操作にまとめることができます。この方法でまとめた場合、操作のすべてのメンバがステータスに関係なく1つの単位として処理されます。1つのメンバでエラーが発生した場合は、すべてのメンバが同じステータスレベルを返します。同様に、すべてのメンバが同じステータスタイプを共有します。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr" jdbc:op-id="0" jdbc:op-type="password-set-operation"> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> <password>Doe{$idu}</password> </add> <jdbc:statement jdbc:op-id="0"> <jdbc:sql>CREATE USER jdoe IDENTIFIED BY {$$password} </jdbc:sql> </jdbc:statement> </input>
jdbc:op-type属性は、論理操作の最初の要素を除くすべての要素では無視されます。
パスワードの初期設定は、通常、データベースユーザアカウントの作成で行われます。<add>イベントが購読者チャネルで生成されるという前提で、パスワード設定をXDS <add>イベントの副次的動作として実装するXSLTスタイルシートによって生成される出力の例を次に示します。
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr" jdbc:op-id="0" jdbc:op-type="password-set-operation"> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> <password>Doe{$idu}</password> </add> <jdbc:statement jdbc:op-id="0"> <jdbc:sql>CREATE USER jdoe IDENTIFIED BY {$$password} </jdbc:sql> </jdbc:statement> </input>
<add>イベントは、jdbc:op-idおよびjdbc:op-type属性によって、論理的にCREATE USER DDLステートメントにバインドされます。
サンプル環境設定ファイルJDBCv2.xml内のUser DDLコマンド変換スタイルシートには、ユーザアカウント作成DDLステートメントを、それをサポートするすべてのデータベースの<add>イベントにバインドするサンプルXSLTテンプレートが含まれています。
パスワードの初期設定は、通常、既存のデータベースユーザアカウントの変更で行われます。<modify-password>イベントが購読者チャネルで生成されるという前提で、modify-passwordを実装するXSLTスタイルシートによって生成される出力の例を次に示します。
<input xmlns:jdbc="urn:dirxml:jdbc"> <modify-password jdbc:op-id="0" jdbc:op-type="password-set-operation"> <password>new password</password> </modify-password> <jdbc:statement jdbc:op-id="0"> <jdbc:sql>ALTER USER jdoe IDENTIFIED BY {$$password} </jdbc:sql> </jdbc:statement> </input>
<modify-password>イベントは、jdbc:op-idおよびjdbc:op-type属性によって、ALTER USER DDLステートメントに論理的にバインドされます。
サンプル環境設定ファイルJDBCv2.xmlのUser DDLコマンド変換スタイルシートには、パスワード保守DDLステートメントを、それをサポートするすべてのデータベースの<modify-password>イベントにバインドするサンプルXSLTテンプレートが含まれています。
パスワード設定とは異なり、オブジェクトパスワードチェックでは、埋め込みSQLステートメントまたは属性は必要ありません。必要なのはユーザアカウント名だけです。これは、関連付けの値(関連付けが手動で保守されていることが前提)、ディレクトリ属性、またはデータベースフィールドから取得できます。ディレクトリまたはデータベースに保存されている場合は、クエリを発行して値を取得する必要があります。
サンプル環境設定ファイル JDBCv2.xmlは、データベースユーザアカウント名をデータベースフィールドに保存します。
NOTE:Sybase Adapative Server EnterpriseやMicrosoft SQL Serverなど、一部のデータベースでは、ユーザアカウント名とログインアカウント名が区別されます。したがって、1つだけではなく2つの名前を保存することが必要になる場合があります。
オブジェクトパスワードチェックを実装するには、<check-object-password>イベントの最後にdest-dn属性値を追加します。次の例では、dest-dn属性が太字になっています。
<input xmlns:jdbc="urn:dirxml:jdbc"> <check-object-password dest-dn="jdoe"> <password>whatever</password> </check-object-password> </input>
パフォーマンスの理由から、複数のステートメントをXDSドキュメントに埋め込むよりも、複数のSQLステートメントを含む単一のストアドプロシージャ/関数を呼び出すことをお勧めします。
次の例では、単一のストアドプロシージャまたは関数が使用されています。
単一のストアドプロシージャ
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="fname"> <value>John</value> </add-attr> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>CALL PROCEDURE set_name('John', 'Doe')</jdbc:sql> </jdbc:statement> </input>
複数の埋め込みステートメント
<input xmlns:jdbc="urn:dirxml:jdbc"> <add class-name="usr"> <add-attr name="lname"> <value>Doe</value> </add-attr> </add> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET fname = 'John' WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> <jdbc:statement> <jdbc:sql>UPDATE indirect.usr SET lname = 'Doe' WHERE idu = {$idu}</jdbc:sql> </jdbc:statement> </input>
ストアドプロシージャまたは関数の呼び出しに使用される構文は、データベースによってさまざまです。詳細については、ストアドプロシージャおよび関数のJDBC呼び出しの構文を参照してください。