将SQL传递给Oracle绑定变量

时间:2010-01-27 14:10:51

标签: oracle variables bind

我需要执行类似的事情:

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

是否可以为SQL2使用绑定变量?
我想保存主要SQL的执行计划。

感谢。

3 个答案:

答案 0 :(得分:2)

在执行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
        )

答案 1 :(得分:0)

继Quassanoi的观点。听起来你可能不熟悉临时表。 This是一个很好的介绍。

您只需创建一次表格。然后在给定的会话中首先:

  1. 填充临时表
  2. 执行从临时表中提取的查询
  3. 回滚。
  4. 不存在与其他会话数据发生冲突/重叠的风险。

答案 2 :(得分:0)

如果这个查询被执行了很多次,我就不会使用临时表了。

有一个'技巧'来绑定一个inlist,Tom Kyte在他的博客中描述了这个:

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

我敢打赌,效率要高得多。使用SQL Trace很容易证明。