оператор select into loop

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

Пожалуйста, мне нужна помощь, чтобы вставить результат одного запроса в другой запрос и вернуть результат, как обычный оператор select

первый запрос:

 select distinct due_dt 
from  ln_acct_repmnt_event
order by 1 asc
  

затем я хочу передать due_dt во второй запрос, который должен выполнять цикл для как можно большего количества записей при возврате первого запроса:

 select TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR, 
EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM dual;
  

и я хочу, чтобы результат был возвращен.

Пожалуйста, есть идеи?

Комментарии:

1. Зачем вам здесь нужен цикл? просто используйте второй запрос, но замените from dual to from ln_acct_repmnt_event . Или вам нужно что-то еще?

2. Вероятно, конструкция, которую вы ищете, — это курсор ДЛЯ цикла . Является ли это хорошим подходом здесь, зависит от того, что вы пытаетесь с ним сделать. Как сказал @Sujitmohanty30, в приведенном вами примере было бы лучше объединить два в один запрос без необходимости каких-либо циклов.

3. Побочное наблюдение: почему вы применяете TO_DATE к DUE_DT? DUE_DT уже должен иметь тип данных DATE . Если это не так, это ошибка дизайна номер один. И если это (как и должно быть) уже ДАТА, применение TO_DATE сначала вызовет подразумеваемый TO_CHAR и высокий риск неправильного сопоставления NLS_DATE_FORMAT . Кроме того, формат RRRR был задуман как временное исправление для Y2K — двадцать лет назад ! Выбросьте это из своих мыслей.

Ответ №1:

Я думаю, это все, что вам нужно:

 WITH duedatesdistinct
     AS (SELECT DISTINCT due_dt
         FROM   ln_acct_repmnt_event)
SELECT due_dt,
       TO_DATE(due_dt, 'DD/MM/RRRR')                     AS date1,
       EXTRACT(year FROM TO_DATE(due_dt, 'DD/MM/RRRR'))  AS year,
       EXTRACT(month FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS month
FROM   duedatesdistinct
ORDER  BY 1 ASC; 
  

Ответ №2:

Просто используйте логику даты в первом запросе:

 SELECT DISTINCT TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
       EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR, 
       EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM ln_acct_repmnt_event
ORDR BY 1 ASC;
  

Если вы действительно хотите, вы можете использовать подзапрос:

 SELECT TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
       EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR, 
       EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
FROM (SELECT DISTINCT due_dt
      FROM ln_acct_repmnt_event
     ) a
ORDR BY 1 ASC;
  

Но подзапрос не нужен.

Ответ №3:

Если вам действительно нужен цикл, используйте цикл for и объедините свой запрос следующим образом.

 For rec in (SELECT DISTINCT 
TO_DATE(due_dt, 'DD/MM/RRRR') as date1,
 EXTRACT(YEAR FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS YEAR, 
 EXTRACT(MONTH FROM TO_DATE(due_dt, 'DD/MM/RRRR')) AS MONTH
 FROM ln_acct_repmnt_event
 ORDR BY 1 ASC)
 Loop
  -- the logic which need to be written
  End loop;