【问题标题】:How do I store values from a single column into a single variable in oracle?如何将单个列中的值存储到 oracle 中的单个变量中?
【发布时间】:2019-10-17 07:23:34
【问题描述】:

以下是我的代码:

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 这样的变量中。

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

【问题讨论】:

  • 是的,bulk select into 的集合是要走的路

标签: oracle plsql collections plsql-package


【解决方案1】:

如果不存在则创建类型

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;

仅使用语句 in (select t.column_value 从表(v_frseventpeseqs)t)

【讨论】:

    【解决方案2】:

    您可以使用 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

    【讨论】:

      【解决方案3】:

      自从

      SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS
      

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

      【讨论】:

        【解决方案4】:

        与使用IN 相比,使用EXISTS 在性能方面总是更好。 此外,如果您正在编写此查询以在 LIVE 环境中定期运行,建议不要使用像 /*+ parallel */ 这样的 HINT。 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);
        

        【讨论】:

          猜你喜欢
          • 2012-04-13
          • 2022-12-19
          • 1970-01-01
          • 2013-01-27
          • 2019-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-22
          相关资源
          最近更新 更多