在oracle中,如何将单个列中的值存储到单个变量中?

在oracle中,如何将单个列中的值存储到单个变量中?,oracle,plsql,collections,plsql-package,Oracle,Plsql,Collections,Plsql Package,以下是我的代码: 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

以下是我的代码:

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
      ));
从EPS中选择EVENTTYPESEQ\u FRS\u PAYMENTS将返回4个值。所以我不能做一个简单的选择

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

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 );
从EPS\U FRS\U付款中选择EVENTTYPESEQ返回四个值:

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


我如何才能做到这一点-数组/集合/记录/批量收集到?

如果类型不存在,请创建类型

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\U value中的语句
从表v\u frseventpeseqs t

可以使用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);
您可以在此处找到更多信息:

SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
不相关您不需要在此处进行任何优化-Oracle将只运行此子查询一次。

与在中使用相比,使用EXISTS在性能方面总是更好。 此外,如果您编写此查询是为了在实时环境中定期运行,建议不要使用/*+parallel*/之类的提示。提示应仅用于临时查询

我已使用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);