Передача SQL в переменную связывания Oracle - PullRequest
1 голос
/ 27 января 2010

Мне нужно выполнить что-то вроде:

select  
[very big SQL]  
where phone_number in(:SQL2)  

Можно ли использовать переменную связывания для SQL2?
Я хочу сохранить план выполнения основного SQL.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 27 января 2010

Создайте временную таблицу и сохраните там результаты SQL2 до выполнения SQL1:

CREATE GLOBAL TEMPORARY TABLE mytemptable (id INT NOT NULL)

CREATE OUTLINE ol_sql1
ON
SELECT  *
FROM    sql1
WHERE   id IN
        (
        SELECT  id
        FROM    mytemptable
        )

INSERT
INTO    mytemptable
SELECT  *
FROM    sql2

SELECT  *
FROM    sql1
WHERE   id IN
        (
        SELECT  id
        FROM    mytemptable
        )
0 голосов
/ 28 января 2010

Если этот запрос выполняется много раз, я бы не использовал временную таблицу для него.

Существует «хитрость» для связывания списка, которую Том Кайт описывает в своем блоге:

http://tkyte.blogspot.com/2006/06/varying-in-lists.html

Я бы поспорил, что это гораздо эффективнее. Это должно быть легко доказать с помощью трассировки SQL.

0 голосов
/ 27 января 2010

Далее к точке Кассаноя. Похоже, вы не знакомы с временными таблицами. Это - хорошее введение.

Вы создаете таблицу только один раз. Затем в течение данного сеанса вы сначала:

  1. заполнить временную таблицу
  2. выполнить запрос, извлекая из временной таблицы
  3. Откат.

Нет риска конфликта или совпадения с данными другого сеанса.

...