Oracle变量绑定(ORA-01008)

时间:2016-08-17 09:12:54

标签: oracle cakephp-2.0 oci

我是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:

1 个答案:

答案 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”事件替换为各自的值,查询应该有效。