我是Oracle变量绑定概念的新手。每当我从客户端请求请求总是在运行时,它根本不会中止。我试图找到执行Oracle DB的当前Query。我得到以下查询。但是,如果我运行此查询,则显示错误。任何人都可以建议我解决这个问题。要选择记录,我使用cakePHP查找'all''。
SELECT COUNT(*) AS count FROM table table
WHERE ((table.field1 LIKE :"SYS_B_0") OR (table.field2 LIKE :"SYS_B_1"))
AND ((table.field3 = :"SYS_B_2") AND (table.field4 = :"SYS_B_3")
AND (table.field5 = :"SYS_B_4")) AND ((table.field6 IS NULL)
OR (table.field7 != :"SYS_B_5")) AND table.field8 = table.field1;
outcome:
ORA-01008: not all variables bound
01008. 00000 - "not all variables bound"
*Cause:
*Action:
答案 0 :(得分:0)
Oracle将所有查询保存在查询缓存中(查看select * fom v$sql
)。一旦执行查询,Oracle就会检查缓存以查看该特定查询是否已存在。如果是,它“知道”如何执行它,如果不是,它必须制定一个查询计划(这需要额外的时间)(这在Oracle术语中称为“硬解析”)。
如果应用程序未使用绑定变量,则所有文字(主要是列值)都存储在缓存中。这些查询:
select * from clients where name = 'Smith'
select * from clients where name = 'Jones'
是缓存中的2个不同查询。当然他们的计划是相同的(通常),但数据库无法知道这一点。这是Oracle查询缓存的低效使用(因为它有2个条目而不是1个)和数据库时间(因为它制定了2个执行计划,其中1就足够了)。
因此,行为有效的应用程序对所有文字使用绑定变量。以下查询:
select * from clients where name = :bind_variable
始终具有相同的执行计划。在执行之前,应用程序可以将任何文字值绑定到变量:bind_variable
,例如'Smith'或'Jones'和数据库将检索正确的记录。应用程序绑定到变量的值无关紧要,对于数据库,它始终是相同的查询,它将重用缓存中的现有执行计划。
现在您可以看到您的查询出了什么问题:您没有告诉Oracle它需要绑定到变量的值(或者用简单的英语,要替换的参数)。
将所有“:bind_variable”事件替换为各自的值,查询应该有效。