5

機能に似たものを実現する必要がある esql (IBM Websphere Message Broker) にサブフローがありselect distinctます。

背景: Oracle データベースにテーブルがありますgroup_errcode_refERROR_CODEこのテーブルは、とのほぼ固定リンク/マッピングですIDERROR_CODEは一意ですが、ID複製できます。たとえば、エラー コード 4000 と 4001 は両方とも ID 1 に関連付けることができます。

私の esql サブフローには、フローに入る現在のデータに基づいて変化する一連のエラー コードがあります。

だから私がする必要があるのは、入力エラーコード配列を取得IDし、テーブルから配列内のすべてのエラーコードを選択する必要があることですgroup_errcode_ref

私が今持っているもの:

declare db rows;
set db.rows[] = (select d.ID from Database.group_errcode_ref as d where d.ERROR_CODE in (select D from errCodes.Code[] as D);

errCodes入力からのエラー コードの配列です。rowエラーコードに対応するすべての ID の配列です。

db.rows[]これで問題ありませんが、配列から重複を削除したいと考えています。

esql でこれを行う最善の方法はわかりませんが、サポートしていませんdistinctgroup by、 またorder by

4

2 に答える 2

2

PASSTHRU ステートメントを使用している場合は、データベース マネージャーのすべての機能がサポートされているため、同様に明確です。

克服しなければならない唯一のことは、データベース クエリとメッセージ ツリー クエリを PASSTHRU に直接混在させることはできないということです。パススルーに渡すものはすべてデータベースに直接送られます。

したがって、元のソリューションは次のようになります。

set db.rows[] = PASSTHRU 'select distinct d.ID from SCHEMA.group_errcode_ref as d where d.ERROR_CODE in ' || getErrorCodesFromInput(errCodes) TO Database.DSN1;

ここで、getErrorCodesFromInput は文字を返す関数です。これには、入力のエラー コードが含まれており、クエリ用に正しくフォーマットされています (例: (ec1、ec2、...))。

于 2016-02-04T06:31:49.160 に答える
0

私の回避策は、個別の選択や並べ替えをまったく行わず、別の回避策を行うことになりました。

基本的に、ERROR_CODE の配列全体を反復処理し、次に error_code に対応する ID を照会してから、それらを挿入するテーブルで count(*) を選択します。

これは、ID/Issue ペアを挿入するため、特定のアプリケーションでのみ機能します。

基本的には次のようになります。

for x as errs.Error[] do
    declare db row;
    set db.rows[] = passthru('select ID from my_static_map_table where error_code = ?;' values(x.Code));

    declare db2 row;
    set db2.rows[] = passthru('select count(*) from my_table_2 where guid = ? and id = ?;' values(guid, db.ID));

    if db2.COUNT == 0 then
        -- Here I do an insert into my_table_2 with ID and a few other values
    end if;
end for;

本当に適切な答えではありませんが、私の特定のアプリケーションでは機能します。基本的に、すべてのエラー コードをループして、配列全体を送信するのではなく、一度に 1 つずつ選択します。次に、別の選択による重複を避けながら、別のデータベースに挿入して、既に挿入されているかどうかを確認します。

より良い答えがあるかどうかを確認するために 1 週​​間待ち、その答えを受け入れます。


アップデート

Attila のソリューションと一致するようにコードを変更しました。これははるかに優れており、元々探していたものです。

追加する唯一のものは、エラー コードをフォーマットする関数です。これは非常に簡単です。

create function FlattenErrorCodesArray(in err row) returns char begin
    declare idx int 1;
    declare ret char;

    for x as errs.Error[] do
        if idx = 1 then
            set ret = '(' || cast(x.Code as char);
        else
            set ret = ret || ',' || cast(x.Code as char);
        end if;
        set idx = idx + 1;
    end for;
    set ret = ret || ')';
end;
于 2016-02-02T21:37:25.487 に答える