处理基于动态的查询以删除所选结果

时间:2017-09-21 22:37:33

标签: oracle oracle-apex oracle-apex-5

我无法删除基于动态查询的报告生成的结果。

我有一个静态区域,我已经定义了用于过滤/搜索的所有页面项目。在提交值之后,类型为" PL / SQL函数体返回SQL查询的经典报告"生成与页面项值匹配。

现在我需要提出一个流程来删除通过经典报告生成的所有结果。请注意,所有页面项都是可选的,这使得它有点复杂,至少对我而言。

以下是我用来生成经典报告的内容:

declare
q varchar2(4000):=NULL;
begin
q:='
SELECT * FROM test WHERE col1 IS NOT NULL AND ';

IF :P001_name IS NOT NULL THEN
q:=q||' name= :P001_name AND ';
END IF;

IF :P001_order_date IS NOT NULL THEN
q:=q||'order_date = :P001_order_date AND ';
END IF;
return q;
END;

我尝试使用上面查询中使用的相同where子句进行删除,但没有帮助。

欢迎任何替代方法/建议。我们的想法是深入查看一些选定的记录,并在审核后将其删除。

我正在使用oracle apex 5.0.4。和Oracle 12C db

1 个答案:

答案 0 :(得分:1)

您的进程需要绑定页面项的所有绑定变量。如上所述,查询中绑定变量的数量会有所不同,这意味着您需要使用DBMS_SQL包。但是,您可以调整它以便修复绑定变量的数量,然后您可以使用execute immediate:

declare
  q varchar2(4000):=NULL;
begin
  q:='DELETE FROM test WHERE col1 IS NOT NULL ';

  IF :P001_name IS NOT NULL THEN
    q:=q||' AND name= :P001_name ';
  ELSE 
    q:=q||' AND :P001_name is null ';
  END IF;

  IF :P001_order_date IS NOT NULL THEN
    q:=q||' AND order_date = :P001_order_date';
  ELSE 
    q:=q||' AND :P001_order_date is null';
  END IF;

  execute immediate q 
    using :P001_name, :P001_order_date;
END;