【问题标题】:How to fetch unchecked checkbox value into a cursor in Oracle Apex如何将未选中的复选框值提取到 Oracle Apex 中的游标中
【发布时间】:2019-12-01 15:41:34
【问题描述】:

这是我的 PL/SQL 代码,用于在按钮的动态操作中获取选中的复选框值。

DECLARE
IHC_ID_Y VARCHAR2(9);
IHC_ID_N VARCHAR2(9);
CURSOR Y IS
    SELECT regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level)
    FROM DUAL
    CONNECT BY regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level) IS NOT NULL;
CURSOR N IS
    SELECT regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level)
    FROM DUAL
    CONNECT BY regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level) IS NULL;
BEGIN
    OPEN Y;
    OPEN N;
    LOOP
        FETCH Y INTO IHC_ID_Y;
        EXIT WHEN Y%NOTFOUND;
        INSERT INTO INFANT_RESPONSE (INF_ID, IHC_ID, IR_DESCRIPTION) VALUES (:INF_ID, IHC_ID_Y, 'Y'); 
    END LOOP;
    CLOSE Y;
        LOOP
        FETCH N INTO IHC_ID_N;
        EXIT WHEN N%NOTFOUND;
        INSERT INTO INFANT_RESPONSE (INF_ID, IHC_ID, IR_DESCRIPTION) VALUES (:INF_ID, IHC_ID_N, 'N'); 
    END LOOP;
    CLOSE N;
END;

但是,我在这部分遇到了一个问题,

CURSOR N IS
    SELECT regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level)
    FROM DUAL
    CONNECT BY regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level) IS NULL;

 LOOP
        FETCH N INTO IHC_ID_N;
        EXIT WHEN N%NOTFOUND;
        INSERT INTO INFANT_RESPONSE (INF_ID, IHC_ID, IR_DESCRIPTION) VALUES (:INF_ID, IHC_ID_N, 'N')

如您所见,当我将条件从IS NOT NULL 更改为IS NULL 时,获取的值将全部为空,因此无法插入到表行中。有没有办法获取未选中的复选框值?

【问题讨论】:

  • 请分享参数的示例值:INFANT_HEALTH_CONDITIONS 包含空值而不是空值。

标签: sql oracle plsql oracle-apex


【解决方案1】:

我会建议一种不同的方法:

  • 插入检查的健康状况(因为您知道如何识别它们;它是您的光标Y);我也使用了它,但是在游标 FOR 循环中,因为它使用起来更简单 - 您不必显式打开它,注意退出循环或何时关闭游标 - Oracle 会为您做到这一点。
  • 要插入未经检查的健康状况,请对表中存在的所有条件执行此操作,以创建在第一步中未插入为“已检查”的复选框

类似这样的:

begin
  -- Checked conditions (using your cursor, but as a cursor FOR loop)
  for cur_y in 
    (SELECT regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level) ihc_id_y
     FROM DUAL
     CONNECT BY regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level) IS NOT NULL
    )
  loop
    insert into infant_response (inf_id, ihc_id, ir_description)
    values (:inf_id, cur_y.ihc_id_y, 'Y');
  end loop;

  -- To insert unchecked conditions, insert values that exist in the table
  -- that contains ALL health conditions (let's call it LIST_OF_HEALTH_CONDITIONS)
  -- that aren't inserted as "checked" in the above cursor FOR loop
  insert into infant_response (inf_id, ihc_id, ir_description)
  select :inf_id, 
         h.ihc_id,
         'N'
  from list_of_health_conditions h
  where h.ihc_id not in (select r.ihc_id
                         from infant_response r
                         where r.inf_id = :inf_id
                           and r.ir_description = 'Y'
                        );
end;                        

无法测试,因为我没有您的表格或数据,但是 - 除非我打错字,否则应该没问题。

【讨论】:

  • 我刚刚想出了解决方案,使用了类似的方法。首先,我从包含所有健康状况的原始表中选择所有值,并使用MINUS 运算符从游标 Y 中删除所有值,因此剩余的值将是存储在游标 N 中的未经检查的值。
  • 没关系。但是,当您逐行插入时,循环将比直接插入慢,而我建议的选项执行批量插入。对于小型数据集,您不会注意到任何差异,但是 - 如果您必须处理大量数据,请尝试记住此讨论。
【解决方案2】:

这就是我使用MINUS set 运算符来达到我想要的结果的方式。

CURSOR N IS
    SELECT IHC_ID FROM INFANT_HEALTH_CONDITIONS
    MINUS
    SELECT regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level)
    FROM DUAL
    CONNECT BY regexp_substr(:INFANT_HEALTH_CONDITIONS, '[^:]+', 1, level) IS NOT NULL;

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多