PISQL : SQLパラメータ

お世話になっております。

 

PISQLClientの JDBCドライバを使用して、SQL文によるPIデータアクセスを検討しております。

一般のJDBCドライバに対応したアプリケーションや、自分でJAVAで作成したテストプログラムから

SQLパラメータを使用したSQL文によるデータ取得を試みましたが、正しく検索できるものと

検索結果が0件になるものがありました。

 

例えば、

select a.Element, a.Name Attribute, sv.TimeStamp, sv.Value, sv.Error

 

From Master.Element.Attribute a

 

CROSS APPLY Master.Element.GetSampledValues(a.ID, 'y','t','1h') sv

 

WHERE a.Element = ? AND a.Name = ?

(※ ?がSQLパラメータです。String型で渡しています。)

 

というSQL文では、SQLパラメータを使用しない場合はデータが検索されますが、

SQLパラメータを使用した場合は検索結果が0件になります。

 

一方で

SELECT ef.Name Procedure, ef.StartTime, ef.EndTime, a.Name Attribute, TimeStamp, Value, Error

 

FROM Master.EventFrame.EventFrame ef INNER JOIN Master.EventFrame.Attribute a

 

ON a.EventFrameID = ef.ID WHERE ef.Template = ? AND ef.StartTime

 

BETWEEN ? AND ?

(※ ?がSQLパラメータです。String型で渡しています。)

 

というSQL文では、正しく検索がされました。時刻はy, tや、SQL時刻書式の文字列どちらでも大丈夫でした。

 

GetSampledValuesなどの関数を使用している場合にはSQLパラメータが使用できないなどの、

なにか条件があるのでしょうか? 文字列の渡し方などに問題があるのでしょうか?

ご教示よろしくお願いいたします。

  • 追加情報です。

     

    検索には java.sql.PreparedStatementクラスのexecuteQuery()メソッドを実行しています。

     

    PISQL ClientのJDBDドライバのバージョン:4.1.19143.1

    DBMS製品名:PI SQL Data Access Server (RTQP Engine) 2018 SP2, 1.7.19087.2

     

    バージョン:AF: 2.10.5.9075

     

  • こんにちは。

    Google Translateを使用して翻訳するため、言葉にエラーがあります。まず、ご理解お願いいたします。

    GetSampledValues TVFを使用してクエリをパラメータ化する方法についてのお問い合わせいただきました。

    Elementの名前とattribute名がinputであると思われます。

     

    重複している場合がありますので、なるべくtemplateをベースにしたクエリをお勧めします。

    しかし、私の場合にはRTQP EngineのCustom object生成機能を介して使用が可能でした。

     

    使用クエリは次のとおりです:

     

    CREATE FUNCTION [Custom].[Element].[GetSampledValueswElemAttrName]

     

    (

     

        @elemName String,

     

        @attrName String

     

    )

     

    AS

     

    select a.Element, a.Name Attribute, sv.TimeStamp, sv.Value, sv.Error

     

    From Master.Element.Attribute a

     

    CROSS APPLY Master.Element.GetSampledValues(a.ID, 'y','t','1h') sv

     

    WHERE a.Element = @elemName AND a.Name = @attrName

    そして、実際のクエリ実行時には、これで実行できました。

     

    SELECT *

     

    FROM [Custom].[Element].[GetSampledValueswElemAttrName]

     

    (

     

        'Elementname',

     

        'AttributeName'

     

    )

    どうぞ試してくれるください。

     


    pastedImage_1.png.png

     

    Best,

    Jinmo

  • Jinmo Yi 様

     

    早速のご返信ありがとうございます。

    教えていただいたように関数を定義して試してみましたが、通常のSQL文では同じように検索できましたが、

    SQLパラメータ渡しでは、検索結果が0となりました。

    以下、JAVAのアプリケーションで試した結果となります。

     

    SQL文に直接条件を書いた場合:検索結果25件


    pastedImage_4.png.png

     

    検索条件をSQLパラメータで渡した場合:検索結果0件

     


    pastedImage_6.png.png

    時間などをパラメータ渡しにした場合は検索できているのですが、ElementやAttributeをパラメータ渡しにした場合に

    正しく検索できていないようです。パラメータの渡し方に問題があるのでしょうか?

     

    引き続きよろしくお願いいたします。

  • テストに時間がかかった申し訳ありません。

    下は、私がテストした設定です。以下の設定で、クエリができました。私の考えは、named parameterがサポートされていないようです。もしかしたら、あなたのappでparameterの名前なしで確認が可能でしょうか?

     

    private final static String query = "SELECT * FROM Custom.Element.GetSampledValueswElemAttrName(?,?)";

    pStatement.setString(1, "P-214");

     

    pStatement.setString(2, "Motor Amps");

    connection.prepareStatement(query).executeQuery()

     

    console appであるため、他の部分があるか分かりません。是非ご確認お願いいたします。

  • Jinmo Yi様

     

    ご確認ありがとうございます。

    DB Visualizerでも確認してみましたが、

      "YB装置01", "温度01"  という日本語の検索条件では検索結果が0件になりましたが、

      "Y-unit01", "Conc"という英語の検索条件では、正しく検索できました。

     

    日本語の文字コードに問題がありそうです。

    そのあたりを調べてみて、またご報告させていただきます。

  • SQLパラメータにダブルバイトの文字列を渡す場合に、正しく検索できないことがわかりました。

    JAVAのプログラム内では、PreparedStatementオブジェクトのsetStringメソッドの代わりに

    setNStringを使用することで、正しく検索をすることができました。

    (例)

    private final static String query = "SELECT * FROM Custom.Element.GetSampledValueswElemAttrName(?,?)";

    pStatement.setNString(1, "YB装置01");

     

    pStatement.setNString(2, "温度01");

    connection.prepareStatement(query).executeQuery();

     

    利用したアプリケーションで検索できなかったのも、このためではないかと推測しています。

    調査していただき、ありがとうございました。

     

    DB Visualizerなどの既存のアプリケーションで日本語を含むSQLパラメータを使用したい場合に、

    どのような手段が考えられるか、分かりましたら教えてください。よろしくお願いいたします。