2017-08-24 8 views
0

私は以下の問題を解決しようとしています: 3列: user_id、 月 値で構成されるテーブルを準備する必要があります。 200人以上の各ユーザーは、LOB、CHANNEL、SUBSIDIARYの期待値を決定するパラメータの値が異なります。そこでテーブルASYSTENT_GOALS_SETに格納することにしました。しかし、私は行を掛けないようにしたいので、すべての条件を "Where"節でさらに使うコードの一部として入れてもいいと思っていました。したがって 、一例として - の代わりに複数行の:私はこのようなエントリを作成プロシージャ内で使用するために、コードの一部をテーブルに文字列として入れる方法はありますか?

enter image description here

enter image description here

これまでのところ、私は(私は特定のユーザのため月と値を収集する)テストテーブルASYSTENT_TESTを作成。私はBULK COLLECTを使った手続きを書いた。

declare 
    type test_row is record 
    (
    month NUMBER, 
    value NUMBER 
); 
    type test_tab is table of test_row; 
    BULK_COLLECTOR test_tab; 
    p_lob varchar2(10) :='GOSP'; 
    p_sub varchar2(14); 
    p_ch varchar2(10) :='BR'; 
    begin 
    select subsidiary into p_sub from ASYSTENT_GOALS_SET where user_id='40001001'; 
    execute immediate 'select mc, sum(ppln_wartosc) plan from prod_nonlife.mis_report_plans 
    where report_id = (select to_number(value) from prod_nonlife.view_parameters where view_name=''MIS'' and parameter_name=''MAX_REPORT_ID'') 
    and year=2017 
    and month between 7 and 9 
    and ppln_jsta_symbol in (:subsidiary) 
    and dcs_group in (:lob) 
    and kanal in (:channel) 
    group by month order by month' bulk collect into BULK_COLLECTOR 
    using p_sub,p_lob,p_ch; 
    forall x in BULK_COLLECTOR.first..BULK_COLLECTOR.last insert into ASYSTENT_TEST values BULK_COLLECTOR(x); 
end; 

だから今、テーブルASYSTENT_GOALS_SET列子会社(varchar型)に(子会社の一つのコードである)文字列12_00_00すべてが正常に動作する構成されていたとき。しかし問題は、ユーザーが2つの子会社で働いている場合です。たとえば、12_00_00と13_00_00です。私はそれを書き留める方法を知りません。子会社の列が構成される必要があります: 「12_00_00」、「13_00_00」 または 「12_00_00」、「13_00_00」私はシングルでDeling」のようなトピックに掘った後、多くのオプションを試してみました13_00_00 または多分 12_00_00' を、 '/エスケープ/ダブルqoutes "。 おそらく実行時に何かを変更する必要がありますか?

おそらく私のアプローチは、最初から完全に間違っています(うまくいけば:))。 私はサポートに感謝します。私は表関数を作成していない

+0

私が正しく理解していれば、動作していない部分は 'ppln_jsta_symbol in(:subsidiary)'でしょうか? – Dessma

+0

はいDessma、まさに。上記のASYSTENT_GOALS_SET列のサブセットの試行とは別に、私はppln_jsta_symbolのコードをsubsidiaryに入れて、 '12_00_00'、 '13_00_00'をSUBSIDIARYに入れようとしました。私はまた、regexp_substrを使用して、私の文字列からSUBSIDIARY列を読み込み、行を作成しようとしましたが、成功しませんでした。 –

+1

現時点でデータベースにアクセスできないため、実際の例を書くことはできませんが、答えの大部分は「TABLE関数を使用する」ヘッダーのセクションにあります。https:// www.oratechinfo.co.uk/delimited_lists_to_collections.html#plsql_function 基本的には、要素の文字列をTABLEに変換し、NOT IN(SELECT * FROM TABLE(f_convert(yourString))))を使用することができます。希望は意味をなさない。 – Dessma

答えて

0

hereを説明したが、その記事は、再びregexp_substr機能を試して戻って私にインスピレーションを得ました。
変更されました:
ppln_jsta_symbol in (:subsidiary)

ppln_jsta_symbol in (select regexp_substr((select subsidiary from ASYSTENT_GOALS_SET where user_id=''fake_num''),''[^,]+'', 1, level) from dual connect by regexp_substr((select subsidiary from ASYSTENT_GOALS_SET where user_id=''fake_num''), ''[^,]+'', 1, level) is not null)
これは魅力的なように機能します。あなたの時間と提案のために@Dessmaありがとう!

0

「私は行を乗じ避けたかった、私が 『どこ』の手順でさらに句で使用するコードの一部として、すべての条件を入れていいだろうと思った」

これがそうです誤った要求行の数については心配すべきではありません。データベースは行の格納と検索に最適化されています。

「マルチバリュー」の列を扱うのはうまくいきません。あなた自身の解決策が証明するように、それはいいものではありません。それはとても良いものから遠いです。実際、それは首の痛みです。これ以降、誰かがsubsidiaryで作業する必要があるたびに、関数を呼び出す必要があります。ユーザの子会社の追加、変更、または削除は、そうするべきであるよりはるかに困難です。また、データの完全性を実施する、すなわち子会社が参照テーブルに対して有効であることを検証する機会はない。

多分あなたにとって重要なことはありません。しかし、Coddが音声データモデルを構築する基礎段階であるFirst Normal Formの基準として「繰返しグループを持たない」ことを義務付ける理由は非常にあります。

ほとんどの業界のベストプラクティスは、CHANNELとは異なる粒度で存在するため、別のテーブルに格納する必要があることを認識することです。

+0

ご意見ありがとうございます。私はまだ学んでいますが、言及したように、私は疑問がありました。それは良いアプローチではありません。私はそれがデータをテーブルに格納する方法ではないことを認識しています。通常は、ユーザーIDに必要な数だけ行を準備し、USER ID、CHANNEL&SUBSIDIARYという固有のエントリを使用して、後でそれらを適切に選択します。
ロングストーリーショート私は、ユーザーの子会社を変更する責任を負う者のための簡単な方法を探していました。 –

関連する問題