Как мне сохранить значения из одного столбца в одну переменную в Oracle? - PullRequest
0 голосов
/ 17 октября 2019

Ниже мой код:

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 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.

Как я могу это сделать - массив / коллекция / записи / массовый сбор в?

Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Вы можете использовать предложение 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 / статьи / разное / с-п

0 голосов
/ 17 октября 2019

Поскольку

SELECT EVENTTYPESEQ FROM EPS_FRS_PAYMENTS

не коррелируется, вам не требуется никакой "оптимизации" - Oracle выполнит этот подзапрос только один раз.

0 голосов
/ 17 октября 2019

Создать тип, если он не существует

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;

только с использованием оператора в (выберите значение t.column_value из таблицы (v_frseventpeseqs) t)

...