APEX 4.1 - 根据航天飞机左侧面板填充数据库

时间:2012-11-19 16:47:25

标签: oracle-apex

APEX版本:4.1.1.00.23 示例:http://apex.oracle.com/pls/apex/f?p=27554:51 登录:演示 pw:demo

我在页面上有一个穿梭机,当我从右侧将项目移动到左侧面板时,我想用'null'更新数据库中的表格列'Analyst'

页面加载时,右侧面板中可能有也可能没有项目。

enter image description here

DB table (when page loads):
Field                          Analyst
Co-Borrower Credit Score       Analyst_1
Appraised Value                Analyst_1
Appraisal Identifier           Analyst_1

然后,在我将部分或全部项目从右侧面板移动到左侧面板并单击“应用更改”后,我希望将“null”放入数据库的分析人员字段中,以便将每个字段名称放在左图。

enter image description here

DB table (after clicking button):
Field                          Analyst
Co-Borrower Credit Score       Analyst_1
Appraised Value                (null)
Appraisal Identifier           (null)

这是我当前的页面流程(提交后):

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
       UPDATE DQ_MANUAL_EDIT
       SET DQ_ANALYST = :P51_DQ_ANALYST
       WHERE DQ_ATTRIBUTE = tab(i);
    end if;
    end loop;
end;

感谢提前!!

2 个答案:

答案 0 :(得分:1)

无法进入班车左侧。右侧具有将提交的值。因此,您只能通过确定数据库值与提交的值之间的变化来更改这些记录 如果可能,首先删除所有关联的记录,然后插入新值。

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    DELETE FROM DQ_MANUAL_EDIT
    WHERE DQ_ANALYST = :P51_DQ_ANALYST;

    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
       INSERT INTO DQ_MANUAL_EDIT (DQ_ANALYST, DQ_ATTRIBUTE)
       VALUES (:P51_DQ_ANALYST, tab(i));
    end if;
    end loop;
end;

如果您不想删除并保留记录但值为NULL,那么您可以先将记录更新为NULL

declare
    tab apex_application_global.vc_arr2;
    l_count number;
begin
    UPDATE DQ_MANUAL_EDIT
    SET DQ_ANALYST = NULL
    WHERE DQ_ANALYST = :P51_DQ_ANALYST;

    tab := apex_util.string_to_table (:P51_SHUTTLE);
    for i in 1..tab.count 
    loop
    select count(*) into l_count from DQ_MANUAL_EDIT WHERE DQ_ATTRIBUTE = tab(i);
     if l_count > 0 then 
              UPDATE DQ_MANUAL_EDIT
              SET DQ_ANALYST = :P51_DQ_ANALYST
              WHERE DQ_ATTRIBUTE = tab(i);
    end if;
    end loop;
end;

使用循环结构时,这是最简单的方法。

答案 1 :(得分:0)

您可以执行两项更新,而不是循环:

UPDATE DQ_MANUAL_EDIT
   SET DQ_ANALYST = :P51_DQ_ANALYST
   WHERE DQ_ATTRIBUTE in (select * from tab);

UPDATE DQ_MANUAL_EDIT
   SET DQ_ANALYST = NULL
   WHERE DQ_ATTRIBUTE not in (select * from tab);

我看到它太简单了吗?