2

スクリプト化された計算ビューに、単一の値の入力パラメーターを取り、別の計算ビューの入力パラメーターに対して複数の入力の文字列を生成する SQL スクリプトがあるとします。

BEGIN 
declare paramStr clob;
params = select foo 
         from bar 
         where bar.id = :IP_ID;

select '''' || string_agg(foo, ''', ''') || ''''
into paramStr 
from :params;

var_out = select * 
          from  "_SYS_BIC"."somepackage/MULTIPLE_IP_VIEW"(PLACEHOLDER."$$IP_IDS$$" => :paramStr);
END

これは期待どおりに機能します。ただし、var_outクエリを変更して where 句で変数を使用しようとすると

BEGIN 
...

var_out = select * 
          from  "_SYS_BIC"."somepackage/MULTIPLE_IP_VIEW"
          where "IP_IDS" in(:paramStr);
END

ビューはアクティブになりますが、クエリから結果が得られません。実行時エラーはなく、空の結果セットのみです。WHERE IN()句に手動で値を渡すと、すべて正常に動作します。初歩的な問題のように思えますが、機能させることができないようです。連結式ではchar(39)なく使用してみましたが、バナナはありません:(''''

4

4 に答える 4

1

さて、あなたがここでやっていることは、ステートメントを動的にしようとしているということです。IN 条件については、一度入力paramStrするとパラメータのセットとして処理されることを期待しているようです。

そうではありません。
コメントからの例を見てみましょう:paramStr = ' 'ip1','ip2' '

がコードに入力されると、次のようにparamStrなります。

var_out = select * 
          from  "_SYS_BIC"."somepackage/MULTIPLE_IP_VIEW"
          where "IP_IDS" in(' ''ip1'',''ip2'' ');

したがって、一致するレコードを探すのではなく、IP_DS = 'ip1' or IP_DS = 'ip2'文字通り一致するレコードを探していますIP_DS = ' 'ip1','ip2' '

これを回避する 1 つの方法は、APPLY_FILTER()関数を使用することです。

var_out = select * 
          from  "_SYS_BIC"."somepackage/MULTIPLE_IP_VIEW";

filterStr = ' "IP_IDS" in (''ip1'',''ip2'') ';

var_out_filt = APPLY_FILTER(:var_out, :filterStr) ;

私はそれについて少し前に書いたことがあります:「IN条件での複数の間違いについて」。また、APPLY_FILTERのドキュメントもご覧ください。

于 2017-03-06T06:23:52.290 に答える
0

最も包括的な説明はこちら: https://blogs.sap.com/2019/01/17/passing-multi-value-input-parameter-from-calculation-view-to-table-function-in-sap-hana -ステップバイステップガイド/

  1. 文字列を複数の値に分割するカスタム関数の作成

次に、内部/左外部結合を使用してフィルター処理できます。

于 2020-05-12T12:02:23.043 に答える