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

process on a dynamic based query to delete selected results

我在删除基于动态查询的报告生成的结果时遇到问题。

我有一个静态区域,我在其中定义了所有用于 filter/search 的页面项目。提交值后,将生成与页面项值匹配的 "PL/SQL Function body returning SQL query" 类型的经典报告。

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

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

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 子句进行删除,但没有帮助。

欢迎任何替代方案methods/suggestions。这个想法是深入到一些选定的记录并在审查后删除它们。

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

您的进程需要为页面项绑定所有绑定变量。正如所写,查询中绑定变量的数量各不相同,这意味着您需要使用 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;