Open棟梁 wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

パラメタライズド・クエリの初歩

動的パラメタライズド・クエリの仕様

方法

パラメタライズド・クエリのバインド変数へのバインド方法は?

名前バインドにのみ対応しています。このため、どのデータプロバイダであっても、順番バインドをサポートしません。

パラメタライズド・クエリのバインド変数への属性指定方法は?

ストアド プロシジャ、無名PL/SQLブロックの実行や、戻り値の取得などは可能か?

ストアド プロシジャでも動的パラメタライズド・クエリ機能を使用できます。

ストアド プロシジャの実行方法

ストアド プロシージャの実行も可能である。

CmnDao経由でのストアド実行

デッドロック、ロックタイムアウト、「ユニークキーの重複」などの例外をリトライしたい。

B層ベースクラス2の例外処理をカスタマイズして、 リトライ対象例外を業務例外に振り替え、P層に正常系の戻り値が戻るようにします。

SetUserParameter()メソッドの利用ポリシーをどのように考えるべきか?

D層自動生成ツールで楽観排他を、どのように実装するのか?

OracleのCLOBをODP.NET経由でどう扱うのか?

サンプル

参考

性能

コマンド タイムアウト値を設定するにはどうすれば良いか?

共通のコマンド タイムアウト値をconfigファイルに設定できます。

ODP.NET、HiRDBの配列バインドをサポートしているか?

ポイント

ODP.NET配列バインドの場合、

サンプル

以下、ODP.NETのサンプル(自作Daoクラス)。

// SQLを設定
this.SetSqlByCommand("INSERT INTO XXX(AAA, BBB, CCC) VALUES(:P1, :P2, :P3);");

// ODP.NETの配列バインドの場合は、ArrayBindCountを指定
((DamOraOdp)this._dam).DamOracleCommand.ArrayBindCount = temp.Length;

// 配列データを作成
object[] temp1 = new string[] { "aaa", "bbb", "ccc" };
object[] temp2 = new string[] { "aaa", "bbb", "ccc" };
object[] temp3 = new string[] { "aaa", "bbb", "ccc" };

// 配列データをバインド(型情報が必要)
this._dam.SetParameter("P1", temp1, OracleDbType.Varchar2);
this._dam.SetParameter("P2", temp2, OracleDbType.Varchar2);
this._dam.SetParameter("P3", temp3, OracleDbType.Varchar2);

SQLで暗黙の型変換が発生し、検索処理性能が大幅に劣化する。

対策

参考

動的パラメタライズド・クエリを記述するXMLファイルのサイズなどにより性能が劣化しないか?

概要

1つのXMLファイル中に200-300タグを超えてくると、オンライン処理でも性能が劣化が始まりますので、
不要なタグは記述しないようにお願いします(XMLファイル サイズについては、問題ないようです)。

詳細

上記のgist.github.comの性能測定の結果は、

性能測定

具体的な性能は、動的パラメタライズド・クエリ分析ツールで測定可能です。

大量データ処理(バッチ更新処理)をサポートしているか?

大量データ処理(バッチ更新処理)で

性能が出ません。

従って、大量データ処理の場合、バッチ処理方式を参照し、

などの技法を活用して、パフォーマンスを出す必要があります。

エラー

動的パラメタライズド・クエリで、[<]、[>]などの文字が含まれると適切に実行されない。

XML内部で使用不可能な文字列は、HTMLエンコーディングが必要になります。

これらの文字列が含まれる場合は、下記の現象が発生します。

動的パラメタライズド・クエリでXMLが編集されずに、そのまま実行される。

として実行されるため、この現象は、不正なフォーマットのXMLを投げている事に起因します。

して下さい。

自動生成Daoの Update処理で「ORA-00972 "識別子が長すぎます"」が発生する。

検索条件のIN句(副問合せ)を動的化したいがエラーとなる。

検索条件のIN句(副問合せ)を動的化する場合、

動的パラメタライズド・クエリ

使用して下さい。

Daoの使い分け

更新系処理

自動生成Dao

単一テーブルからのSELECT

自動生成Dao

複数テーブルなど複雑なSELECT

共通Dao(CmnDao) 

制限事項

動的パラメタライズド・クエリのパラメタ名

アルゴリズム

含むXMLタグを「再帰的」に検索し、

としています。

結論

XMLタグの検索方法が再帰的なので、

↓↓↓

SELECT * FROM Shippers
  WHERE
    ShipperID =@p1 and ShipperID =@p1

サポート

Like句を使用した曖昧検索をサポートしているか?

LINQ や Entity Frameworkをサポートしているか?

任意のDLL(Assembly)からの埋込SQLのロードをサポートしているか?

ようにします。

どのように渡すか?になりますが、
この部分はプロジェクト毎に検討ください。

参考


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS