SQL実行時にバインドパラメータを255個以上渡したい場合について。
こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。
私はIRISでSQLアクセスを行うプログラムをを作成しており、
テーブルアクセスには%ScrollableResultSetクラスのAPIを用いて処理を実現しています。
作成するSQLはインジェクション対策のため、?パラメータを用いておりますが、
この度、大量のパラメータ(600項目)を用いるSQLを作成する必要が出てきました。
https://irisdocs.intersystems.com/iris20191/csp/docbookj/DocBook.UI.Page...
こちらによりますと、可変長引数を用いても引数の上限値は255個となっており、
実際に600個のパラメータを引数に与えてSQLアクセスしようとすると、<STACK>エラーが発生する状況です。
Set query = "SQL文" Set result = ##class(%ScrollableResultSet).%New("%DynamicQuery:SQL") Do result.Prepare(query) Do result.Execute(parameterValue...) #; ここに600個のパラメータをセット
%Execute()の引数がRawStringならよかったのですが、仕様的に可変長引数になっているので、手詰まり状態になっております。
何かいい方法をご存氏の方はいらっしゃいますでしょうか?
Product version: IRIS 2021.1
Ohataさん
こんにちは。
例えば、$listを使用して、10パラメータずつまとめてExecuteメソッドのパラメータに渡すというのはいかがでしょうか。プログラム例は以下のとおりです。(長くなりますので、途中「...」で省略しています)
set rs=##class(%ScrollableResultSet).%New() // Prepare で 60個のパラメータから$listget関数を使って各カラムに分けたものをINSERTします。 set ret=rs.Prepare("INSERT coltest.test (P0000, ... ,P0599) " _" SELECT $listget( P0,1), ... ,$listget( P0,10) " _",$listget( P1,1), ... ,$listget( P1,10)" : _",$listget(P59,1), ... ,$listget(P59,10) " _" FROM (SELECT ? as P0,? as P1,? as P2, ... ,? as P58,? as P59)") quit:$$$ISERR(ret) ret set ret=rs.Execute($lb("PPP0", ... ,"PPP9") ,$lb("PPP10", ... ,"PPP19"), ... ,$lb("PPP590",...,"PPP599")) quit ret
Prepare()メソッドでは、60個のパラメータにP0~P59の名前を付けるサブクエリを作り、それをFROM句に指定して$listget関数で分解したデータをcoltest.testテーブルのP0001~P599のカラムにINSERTするSQL文を指定しています。
Execute()メソッドではデータ10個を$listbuild()関数で$list形式に変換し、パラメータとして指定しています。
Minamoto さん
ご回答ありがとうございます!
SQL自体にObjecsScriptのコマンドを埋め込む発想はありませんでした。
記載いただいた内容含め、検討してみます。