Sql Oracle APEX-将穿梭项目选择保存到新表

Sql Oracle APEX-将穿梭项目选择保存到新表,sql,oracle-apex,Sql,Oracle Apex,我有一个项目,我正在处理的零件和订单。每个订单可能包含多个部分,每个部分在其生命周期内可能存在于多个订单上,尽管一次不超过一个活动订单。我的表格目前如下: PARTS_TABLE PART_NUMBER varchar2(20) ASSIGNED_ORDER_NUMBER number(5) ASSIGNED_ORDER_STATUS varchar2(20) ORDER_TABLE ORDER_NUMBER number (5)

我有一个项目,我正在处理的零件和订单。每个订单可能包含多个部分,每个部分在其生命周期内可能存在于多个订单上,尽管一次不超过一个活动订单。我的表格目前如下:

 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.
这个当前的设置在前面这个问题的帮助下为我们atm工作:但是它需要在两个表中复制大量数据,并且它实际上不允许一个部件在其生命周期内处于多个订单上

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

 ORDER_PARTS_TABLE
      ORDER_NUMBER number(5) (pk1)
      PART_NUMBER varchar2(20) (pk2)
      ORDER_STATUS varchar2(20)
其中零件号和订单号创建关节主键

我的主要问题是根据穿梭项目的值按顺序创建和编辑行。我能够使用当前设置有效地编辑/更新,但在当前设置中,我不尝试创建行,我只是引用PARTS_表中的行。当一个人使用APEX表格上的穿梭项目向订单添加零件时,应在订单零件表中创建新行,即:

 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_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\u SUBSTR

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;
注意:我没有处理是否已经存在争议,但你明白了


移除项目的处理过程将是相同的,尽管有点复杂。

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;
注意:我没有处理是否已经存在争议,但你明白了


删除项目的过程将是相同的,尽管有点复杂。

嘿,托尼!谢谢你的回复!我只是想澄清一下。。。您已将此设置为提交时的页面进程,对吗?Tony。。。问题:我试图在创建订单的同一页面上运行此流程。因此,订单号将自动递增,并在提交表单时分配。在这个过程中,是否有方法获取该值并使用它来代替:p1\U订单号?这有意义吗?谢谢是的,这应该是可能的,但你所说的自动递增到底是什么意思?它是使用一个基本的数据库序列,在插入新行时从最后一个值递增来生成订单号。在这种情况下,你可以使用序列号而不是:p1\U订单号Y Tony!谢谢你的回复!我只是想澄清一下。。。您已将此设置为提交时的页面进程,对吗?Tony。。。问题:我试图在创建订单的同一页面上运行此流程。因此,订单号将自动递增,并在提交表单时分配。在这个过程中,是否有方法获取该值并使用它来代替:p1\U订单号?这有意义吗?谢谢是的,这应该是可能的,但您所说的自动递增到底是什么意思?它使用一个基本的数据库序列,在插入新行时从最后一个值开始递增,从而生成订单号。在这种情况下,您可以使用sequence_name.currval而不是:p1_ORDER_NUMBER来获取该值