PL / SQL - использование переменных во вложенных запросах - PullRequest
0 голосов
/ 28 сентября 2010

Я хотел бы сделать что-то подобное с PL / SQL:

for ACCOUNT in account_cursor
loop

   for related_data in (select something from table where some_column = ACCOUNT.column)
   loop

   endloop;       

endloop;

(ограничения для акцента)

Я не в своей среде разработки, поэтому не могупроверьте это, поэтому, пожалуйста, игнорируйте любые незначительные синтаксические ошибки.Меня больше волнует вопрос, могу ли я использовать переменные таким образом.

РЕДАКТИРОВАТЬ:

Объяснение того, чего я пытаюсь достичь.У меня есть две огромные таблицы: учетные записи и журнал.Я хочу получить данные журнала для определенных учетных записей.Из-за количества записей прямое выделение / соединение очень медленное.Я пытаюсь ускорить процесс, сначала выбрав интересующие меня учетные записи, а затем присоединив их к таблице журнала.Любой совет будет оценен.

Ответы [ 3 ]

3 голосов
/ 28 сентября 2010

Вы, кажется, смешиваете явный курсор (account_cursor) с неявным курсором (related_data) ...

Помимо ENDLOOP, который должен быть END LOOP, он синтаксически правильный и действительный.Вы можете увидеть примеры обоих типов курсоров в этой ссылке .Но мне интересно, что вы на самом деле делаете, чтобы увидеть, действительно ли необходим курсорный подход.

0 голосов
/ 29 сентября 2010

Как заметил Раджеш, выполнение этого в курсоре будет очень медленным.

Прямое выбор / объединение относительно небольшого числа значений должно выполняться медленно только в больших таблицах, если в запросе не используются соответствующие индексы - убедитесь, что индексы для номера счета существуют как в таблицах учетных записей, так и в таблицах журналов. Если это так, убедитесь, что ваш запрос использует их в плане объяснения.

0 голосов
/ 29 сентября 2010

Пожалуйста, прочитайте ответ выше, прежде чем использовать этот подход. Технически, да, вы можете получить доступ к переменным ... как-то так.

for v_dept_rec in (select deptno from dept where deptno in (10,20)) loop
     for v_emp_rec in (select empno from emp where deptno = V_DEPT_REC.DEPT_NO) loop

      <<<Process here>>

     end loop;
end loop;

"Я написал запрос, используя присоединяется / где пункты и я ищу для возможных улучшений скорости, используя этот подход "

Неизменно, это довольно медленно, так как это построчная обработка. Если вы можете опубликовать репрезентативный код для вашей логики, вы получите ответы, в которых указано, как это происходит в наборах.

...