【问题标题】:process on a dynamic based query to delete selected results处理基于动态的查询以删除选定的结果
【发布时间】:2017-09-22 17:26:21
【问题描述】:

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

我有一个静态区域,我在其中定义了所有用于过滤/搜索的页面项目。提交值后,将生成与页面项值匹配的“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 数据库

【问题讨论】:

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


    【解决方案1】:

    您的流程将需要绑定页面项目的所有绑定变量。如前所述,查询中绑定变量的数量会有所不同,这意味着您需要使用 DBMS_SQL 包。但是,您可以对其进行调整,以便固定绑定变量的数量,然后您可以使用立即执行:

    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;
    

    【讨论】:

    • 谢谢@Tony。奇迹般有效。请您帮助我理解为什么我们会在 else 语句中使用绑定变量而不是列名。此外,当我在 SQL 研讨会中执行该过程时,无论有多少适合查询,我总是会返回相同的输出(已删除 1 个结果。)。 (0 或 20)。但是,当我使用 sql%rowcount 时,它给了我一个准确的计数。实际删除的结果。知道为什么它会这样吗?再次感谢您的回答。
    • else 语句中使用相同的绑定变量的目的是使using 子句仍然正确,即(在此示例中)始终有2 个变量要绑定。我不知道为什么你的结果不符合预期。
    猜你喜欢
    • 2015-05-03
    • 1970-01-01
    • 2020-06-25
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多