Oracle APEX - 将Shuttle Item选项保存到新表

时间:2012-03-14 15:09:32

标签: sql oracle-apex

我正在处理一个项目,我在处理PARTS和ORDERS。每个ORDER可能包含许多PARTS,每个PART在其生命周期内都有可能存在多个ORDER(尽管每次不超过一个ACTIVE命令)。我的表目前如下:

 PARTS_TABLE
      PART_NUMBER varchar2(20)
      ASSIGNED_ORDER_NUMBER number(5)
      ASSIGNED_ORDER_STATUS varchar2(20)


 ORDER_TABLE
      ORDER_NUMBER number (5)
      ORDER_STATUS varchar2(20)
      ORDER_PARTS_LIST varchar2(4000) //Comma delimited list generated by shuttle item.

这个当前的设置对我们来说是有用的(在前一个问题的帮助下:Previous Question)但它需要在两个表中复制大量数据,并且它实际上不允许PART在多个ORDERS上在它的生命过程中。

我想要做的是在这两个表之间创建一个交叉引用表:

 ORDER_PARTS_TABLE
      ORDER_NUMBER number(5) (pk1)
      PART_NUMBER varchar2(20) (pk2)
      ORDER_STATUS varchar2(20)

PART_NUMBER和ORDER_NUMBER创建联合主键的位置。

我的主要问题是根据航班物品的价值在ORDER_PARTS_TABLE中创建和编辑行。我能够使用我当前的设置进行有效编辑/更新,但在我当前的设置中,我不是要创建行,我只是引用PARTS_TABLE中的行。当一个人在APEX表格中使用穿梭物品时,将PARTS添加到ORDER中,应在ORDER_PARTS_TABLE中创建新行,即:

 ORDER_TABLE
      ORDER_NUMBER     ORDER_PARTS_LIST     ORDER_STATUS
      12345            675:342:871:902      ACTIVE


 ORDER_PARTS_TABLE
      ORDER_NUMBER     PART_NUMBER     ORDER_STATUS
      12345            675             ACTIVE
      12345            342             ACTIVE
      12345            871             ACTIVE
      12345            902             ACTIVE

如果稍后编辑了该订单,删除了某个部件,则应该从ORDER_PARTS_TABLE中删除与该关系相关的行,或者将其ORDER_STATUS设置为“REMOVED”

 ORDER_TABLE
      ORDER_NUMBER     ORDER_PARTS_LIST     ORDER_STATUS
      12345            675:871:902          ACTIVE

 either...
 ORDER_PARTS_TABLE
      ORDER_NUMBER     PART_NUMBER     ORDER_STATUS
      12345            675             ACTIVE
      12345            342             REMOVED
      12345            871             ACTIVE
      12345            902             ACTIVE

  or...
  ORDER_PARTS_TABLE
      ORDER_NUMBER     PART_NUMBER     ORDER_STATUS
      12345            675             ACTIVE
      12345            871             ACTIVE
      12345            902             ACTIVE

这有什么意义吗?我目前的解决方案只是使用我一直很满意的触发器,但让我知道解决这个新问题的最佳方法是什么。谢谢!

编辑:我一直在做一些继续挖掘,发现一些听起来相当有希望的东西,如果它可以适应。这里有没有人有经验 REGEXP_SUBSTR? LINK LINK

1 个答案:

答案 0 :(得分:3)

APEX提供了一个实用程序,用于将值分割出来,如下所示:

declare
    tab apex_application_global.vc_arr2;
begin
    tab := apex_util.string_to_table (:p1_multiple_item);
    ...
end;

因此,根据您的要求,您可以:

declare
    tab apex_application_global.vc_arr2;
begin
    tab := apex_util.string_to_table (:p1_multiple_item);
    for i in 1..tab.count loop
        insert into order_parts_table (order_number, part_number, order_status)
        values (:p1_order_number, tab(i), 'ACTIVE');
    end loop;
end;

(注意我还没有处理过该行是否已经存在,但你明白了。)

删除项目的处理将沿着相同的路线进行,但有点复杂。