Oracle在哪里使用变量

时间:2010-07-16 12:58:03

标签: sql oracle plsql

我正在尝试在PL / SQL过程中运行SQL。如果我要说:

SELECT * FROM myTable WHERE FNAME like 'Joe%' AND dept = 'xyz';

立即运行。

如果我尝试将'Joe'放在一个变量中,它需要永远运行,大约3分钟。以下是我发现的与变量一样使用的一些语法。

PROCEDURE myProcedure(firstName IN VARCHAR,
                      cEmployees OUT cursor_type)
IS
BEGIN
     OPEN cEmployees FOR
     SELECT * FROM myTable WHERE FNAME like firstName || '%' AND dept = 'xyz';
END myProcedure;
我做错了什么?感谢。

2 个答案:

答案 0 :(得分:4)

我有一段时间没有在甲骨文工作过 但是,你可以避免这个

SELECT * FROM myTable WHERE FNAME like firstName || '%'

相反,请在上述语句之前设置firstName变量 例如firstName = firstName || '%'(请原谅语法)
然后SELECT * FROM myTable WHERE FNAME like firstName

答案 1 :(得分:0)

(抱歉,评论时间过长,所以我将其添加为“答案”)

特拉维斯,我怀疑你还没有完全正确。你已经改变了查询并“修复它”(即在不到3分钟的时间内运行),但你不知道为什么。稍后您可能会发现新程序将再次遇到同样的问题。

原因是当重新分析查询时(例如,当您对其进行少量更改时,如添加括号),Oracle会为查询生成新计划。当它生成查询时,它可能正在使用绑定变量偷看来查看您正在搜索的内容。当它使用值'Joe'解析它时,它会为该特定值创建最佳计划,并且它会快速运行。但是,如果稍后重新解析查询(随着查询从共享池中老化,它可能会不时),可能会呈现不同的值(例如“Tom”) - 并且Oracle将优化查询该值,这可能是一个非常不同的计划。然后,突然之间,对“Joe”的查询运行得慢得多。

底线:如果您不知道为什么它变得更快,您不知道改进是永久的还是暂时的。

免责声明:以上只是一般性建议 - 如果您指定数据库版本,并提供两个查询的解释计划输出,您可能会得到更具体的建议。