0

1 つのディメンション、1 つのメジャー、およびフィルター (where 句) を指定して分析ビューを探索できるプロシージャを作成しています。

drop procedure dynamicExploration;

create procedure dynamicExploration(in currentMeasure double, in filter_string 
varchar(100), out dataSubset dataExplorationOutputType)
language sqlscript as

begin
      dataSplitby = select CITY as ID, SUM(:currentMeasure) as SUM_MEASURE from
     _SYS_BIC."package/analyticView" Group by CITY;

  --dataSubset = APPLY_FILTER(:dataSplitby, :filter_string);
  dataSubset = select * from :dataSplitBy;
end;

ここで、dataSubset は次のように定義されたデータ型です。

drop type dataExplorationOutputType;
create type dataExplorationOutputType as table("ID" varchar(100), "SUM_MEASURE" double);

しかし、このエラーが発生しています。何が問題なのかを確認してください。

Could not execute 'create procedure dynamicExploration(in currentMeasure double, in    
filter_string varchar(100), out ...' in 166 ms 8 µs .
SAP DBTech JDBC: [266] (at 200): inconsistent datatype: only numeric type is available    
for aggregation function: line 4 col 36 (at pos 200)

currentMeasure を varchar として定義しようとしましたが、それでも同じエラーが発生します。

私が最終的に達成しようとしているのは、ユーザーによって定義された特定のパラメーター (ディメンション、メジャー、およびフィルター) のセットに基づいて、別のプロシージャーがデータのサブセットを選択するのに役立つストアド プロシージャーを作成することです。

プロシージャの動的探索を削除します。

create procedure dynamicExploration(in currentDimension varchar(100), in currentMeasure   double, in filter_string 
 varchar(100), out dataSubset dataExplorationOutputType)
 language sqlscript as

 begin
  dataSplitby = select :currentDimension as ID, SUM(:currentMeasure) as SUM_MEASURE from
  _SYS_BIC."package/analyticView" Group by :currentDimension;

  dataSubset = APPLY_FILTER(:dataSplitby, :filter_string);
 --dataSubset = select * from :dataSplitBy;
 end;

推奨されない機能である動的 SQL に基づいて、この種の動的探索を行う手順を既に作成しました。私が探しているのは、この種の分析ビュー (データ キューブ) の動的な調査を行うためのより良いソリューション/アイデアです。

ありがとう

4

1 に答える 1

2

動的 SQL を作成し、EXECUTE IMMEDIATE コマンドで実行する必要があります。推奨されていないことはわかっていますが、ユースケースでは必要です。たとえば、ラッパー プロシージャに渡されるディメンションの名前を「許可された」ディメンションのリストと照合して、SQL インジェクションから身を守るようにしてください。

于 2013-10-25T01:31:16.833 に答える