如何只将APEX表格中的已检查行添加到另一个表?

时间:2014-10-23 10:17:48

标签: sql oracle plsql sql-insert oracle-apex

我已经从视图创建了表格形式 - 因此只有选中的项目才会添加到表格中。到目前为止,我只能插入所有记录而不是单独选择的行。

这是我使用的代码:

DECLARE
   v_insertcount NUMBER := 0;
BEGIN
   FOR i IN 1 .. apex_application.g_f02.COUNT
   LOOP
     IF apex_application.g_f01 (i) IS NOT NULL THEN -- this is the checkbox

       insert into my_table (pme_id, MYREF, STAC, START_DATE)
        values ( SEQ_PME.NEXTVAL,
                 :P5_MYREF
                 apex_application.g_f02(i),
                 apex_application.g_f03(i)
               )

       v_insertcount := v_insertcount + 1;
     END IF;
   END LOOP;
END;

1 个答案:

答案 0 :(得分:1)

首先你必须记住only checked checkboxes are submitted。因此,您无法测试NULL以识别未选中的框。这只是数组中的

因此,由于复选框数组大小小于或等于其他字段数组大小,因此您无法使用 index 查找同一行的相应值。

有一些clever tricks to overcome that limitations。但是,对于简单的情况,解决方案只是使用查找功能将id映射到索引

   FUNCTION array_search(value IN VARCHAR2, arr IN apex_application_global.vc_arr2)
   RETURN PLS_INTEGER
   IS
   BEGIN
     FOR i IN 1 .. arr.COUNT
     LOOP
       IF arr(i) = value THEN
         RETURN i;
       END IF;
     END LOOP;

     return 0;
   END;

这是线性搜索。所以表演非常好。无论如何,表格处理可能就足够了。鉴于该功能,您现在可以写:

  

地区来源

SELECT APEX_ITEM.CHECKBOX(1,pme_id) " ",
       ...
  

提交流程

   FOR i IN 1 .. apex_application.g_f01.COUNT -- your checkboxes
   LOOP
     -- identify the "row index"
     idx := array_search(apex_application.g_f01(i), apex_application.g_f02);
     --                  ^^^^^^^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^^^^^^^^^
     --                     checkboxes array               id array

     -- assuming now idx > 0
     -- (in production code, should check and log in case of `0`)


     -- do whatever you want, using `idx` as index

     insert into my_table 
                   (pme_id, 
                    MYREF,
                    STAC,
                    START_DATE
                                ) 
      values ( 
                      SEQ_PME.NEXTVAL,
                      :P5_MYREF
                      apex_application.g_f02 (idx),
                       apex_application.g_f03 (idx)
                   );

   END LOOP;