概要
データソース側には存在するものの、TDV Serverのパーサーが認識できないために実行できない関数を実行可能にする方法について説明します。
本記事では、データソースであるOracle 19cデータベースでは実行可能であるLENGTHC
関数を、デフォルト状態では実行不可であるTDVでも実行可能にする例を示します。
本記事で検証環境として利用するOracle19cデータベースには事前にLENGTHB
関数と同じ結果を返すLENGTHC
関数を事前に定義しています。
検証環境
製品 | バージョン | 備考 |
---|---|---|
TDV Server |
8.5.2 |
Windows Server 2019環境で実行 |
TDV Studo | ||
Oracle | 19c | Amazon RDS |
設定前)TDVからのクエリ実行結果
後述の設定等を実施する前の状態で、TDVからクエリを実行した場合の動作について確認します。
LENGTH関数
TDVにおいてもLENGTH関数はサポートされているため、ビューのSQLパネルにおいてLENGTH関数は認識され、クエリ実行時にもOracleデータソース側にプッシュダウンされることが確認できます。
LENGTHC関数
TDVではLENGTHC
関数は認識されないため、以下のように
'LENGTHC’ is not a recognized function.
というエラーが表示されます。
手順① XMLファイル修正
TDVにLENGTHC
関数をOracleデータソースにプッシュダウンさせるために、XMLファイルを修正します。
XMLファイルは、
[TDV Serverインストール先フォルダパス]\app\dlm\apps\[アダプタ名]\conf
を指します。
Oracle 19c (Thim Driver)の場合は以下のパスに存在します。
[TDV Serverインストール先フォルダパス]\conf\adapters\system\oracle_19c_thin_driver\oracle_19c_thin_driver_values.xml
修正対象のOracleのXMLファイルが特定できましたら、それをテキストエディタ等で開き、ファイル先頭から4行目あたり、Please insert customized elements after this line.
のコメント下に以下の内容を追記します。
<ns37:attribute xmlns:ns37="http://www.compositesw.com/services/system/util/common">
<ns37:name>/runtime/query/LENGTHC</ns37:name>
<ns37:type>STRING</ns37:type>
<ns37:value>LENGTHC($1)</ns37:value>
<ns37:configID>LENGTHC(~any)</ns37:configID>
</ns37:attribute>
ns
の後に続く番号、およびnameはXMLファイルの中にある他のattributeとは異なる一意の値にしてください。
編集完了後は、XMLファイルの修正を反映させるために、TDV Serverサービスを再起動します。
手順② カスタム関数用プロシージャ作成
手順1でcapabilitiesファイルに追記するだけでは、まだTDVはLENGTHC
関数を認識することはできないため、LENGTHC
関数をカスタム関数に登録するためのプロシージャを作成します。
今回のユースケースでは、LENGTHC
関数をOracleデータソースにプッシュダウンさせることが目的であるため、プロシージャは以下のように同名のダミー値を返す内容とします。
PROCEDURE LENGTHC(IN somestring VARCHAR, OUT result INTEGER)
BEGIN
set result = 1;
END
手順③ カスタム関数登録
手順2で作成したプロシージャにおいて定義されている関数をStudioの 管理 > カスタム関数… からカスタム関数として登録します。
設定後)TDVからのクエリ実行結果
上記すべての手順を実施済みの状態で、再度LENGTHC
関数を使用するクエリを実行すると、LENGTHC
関数がTDVによって認識され、かつ、Oracleデータソース側にプッシュダウンされることが確認できます。