0

以下是我的代码:

SELECT
      /*+ parallel (sales 8) */     
      COUNT(1)
    INTO v_datacount_actualtable
    FROM sales
    WHERE processingunitseq=38
    AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
    OR eventtypeseq IN
      (SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
      ));

SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS将返回 4 个值。所以我不能做一个简单的 SELECT INTO。

我想将结果存储SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS到一个变量中并使代码如下所示,这样子查询就不会每次都执行。

SELECT
      /*+ parallel (sales 8) */     
      COUNT(1)
    INTO v_datacount_actualtable
    FROM sales
    WHERE processingunitseq=38
    AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
    OR eventtypeseq = v_frseventpeseqs );

SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS返回四个值:

1,
2,
3,
4,

我不想在代码中硬编码这些值,因为这是一种不好的做法。需要它在像 v_frseventypeseqs 这样的变量中。

我该怎么做 - 数组/集合/记录/批量收集到?

4

4 回答 4

0

与usingEXISTS相比, using 在性能方面总是更好IN。此外,如果您正在编写此查询以在 LIVE 环境中定期运行,建议不要使用/*+ parallel */. HINT 应仅用于临时查询。

我使用以下方法重写了您的查询EXISTS

SELECT
    /*+ parallel (sales 8) */     
    COUNT(1)
    INTO v_datacount_actualtable
    FROM sales sl
    WHERE processingunitseq=38
    AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
    OR EXISTS ( SELECT 1 from EPS_FRS_PAYMENTS efp where s.eventtypeseq = efp.eventtypeseq);
于 2019-11-18T22:06:05.113 回答
0

您可以使用 WITH 子句。优点是对子查询的重复引用可能更有效,因为数据很容易从临时表中检索,而不是通过每个引用重新查询。

WITH eventtypeseq_query AS 
     (SELECT EVENTTYPESEQ 
      FROM EPS_FRS_PAYMENTS)
SELECT
       /*+ parallel (sales 8) */   
       COUNT(1)
INTO v_datacount_actualtable
FROM sales
WHERE processingunitseq=38
  AND (compensationdate BETWEEN TO_DATE(v_startdate,'DD-MON-YYYY') AND TO_DATE(v_enddate,'DD-MON-YYYY')
        OR eventtypeseq IN eventtypeseq_query);

您可以在此处找到更多信息: https ://oracle-base.com/articles/misc/with-clause

于 2019-10-17T08:13:32.893 回答
0

如果不存在则创建类型

CREATE OR REPLACE 
TYPE t_number1 AS TABLE OF NUMBER(8,0)

它是数字数组

并在 PL/SQL 中使用

declare
v_frseventpeseqs t_number1;
begin
    SELECT EVENTTYPESEQ bulk collect 
    into v_frseventpeseqs 
    FROM EPS_FRS_PAYMENTS;

    for i in (select t.column_value id from table(v_frseventpeseqs) t)
    loop
        dbms_output.put_line(i.id );
    end loop;

end;

仅在 (select t.column_value from table(v_frseventpeseqs) t) 中使用语句

于 2019-10-17T07:43:27.053 回答
0

自从

SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS

不相关,您在这里不需要任何“优化” - Oracle 将只运行此子查询一次。

于 2019-10-17T09:55:13.693 回答