如何将代码的一部分作为字符串放在 table 中以在过程中使用它?

How to put a part of a code as a string in table to use it in a procedure?

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

我创建了这样的条目:

到目前为止,我创建了测试 table 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;

所以现在当 table 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 在深入研究 "Deling with single/escaping/double qoutes" 等主题后,我尝试了很多选项。 也许我也应该在立即执行中更改一些内容?

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

我没有创建 here 描述的 table 函数,但那篇文章启发我回去再次尝试 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 的宝贵时间和建议!

"I wanted to avoid multiplying rows and thought it would be nice to put all conditions as a part of the code that I would use in 'where' clause further in procedure"

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

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

也许 none 这对您很重要。但是,Codd 强制要求 "no repeating groups" 作为 First Normal Form 的标准是有充分理由的,这是构建健全数据模型的基础步骤。

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