0

我正在尝试解决以下问题:我需要准备包含 3 列的表:user_id、月份值。来自 200 多个用户的每个用户都有不同的参数值来确定期望值,它们是:LOB、CHANNEL、SUBSIDIARY。所以我决定将它存储在表 ASYSTENT_GOALS_SET 中。但是我想避免将行相乘,并认为将所有条件作为代码的一部分放在我将在过程中进一步用于“where”子句的代码中会很好。因此,作为示例 - 而不是多行:

在此处输入图像描述

我创建了这样的条目: 在此处输入图像描述

到目前为止,我创建了测试表 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 列 SUBSIDIARY (varchar) 包含字符串 12_00_00 (这是子公司之一的代码)时,一切正常。但问题是当用户在两个子公司工作时,比如说 12_00_00 和 13_00_00。我不知道如何写下来。SUBSIDIARY 列是否应该包含:'12_00_00'、'13_00_00' 或 "12_00_00"、"13_00_00" 或者可能是 12_00_00'、'13_00_00 在挖掘诸如“使用单/转义/双引号”之类的主题后,我尝试了很多选项。也许我也应该立即执行更改?

或者我对这个问题的处理方法从一开始就完全错误(希望不是:))。我将不胜感激。

4

2 回答 2

0

我没有创建这里描述的表函数,但那篇文章启发了我回去 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 的时间和建议!

于 2017-08-25T21:47:28.593 回答
0

“我想避免行数相乘,并认为将所有条件作为代码的一部分放在我将在程序中进一步使用的 'where' 子句中会很好”

这似乎是一个错误的要求。您不必担心行数:数据库已针对存储和检索行进行了优化。

他们不擅长的是处理“多值”列。正如您自己的解决方案所证明的那样,它并不好,它远非好,实际上它完全是颈部疼痛。从现在开始,每次有人需要使用 subsidiary他们都必须调用一个函数。添加、更改或删除用户的子公司比它应该做的要困难得多。也没有机会强制执行数据完整性,即根据参考表验证子公司是否有效。

也许这些对你来说都不重要。但是,Codd 规定“无重复组”作为第一范式的标准是有充分理由的,这是建立健全数据模型的基础步骤。

正确的解决方案,近四十年来的行业最佳实践,将认识到 SUBSIDIARY 存在于与 CHANNEL 不同的粒度,因此应该存储在单独的表中。

于 2017-08-26T07:39:44.553 回答