2016-06-07 32 views
3

我有一个Oracle错误(ORA-01008):事情是这个错误第一次出现,没有修改table/Schema(但是有数据库升级)。 我试过立即执行,但我仍然得到相同的错误。ORA-01008:数据库升级后并非所有变量绑定

SET serveroutput ON; 
set define off; 
--alter session set "_subquery_pruning_enabled"=false; 
DECLARE 
    z_value NUMBER  := -1; 
    CURSOR listedocument 
    IS 
    select to_number(2310458) as coco from dual; 
BEGIN 
    FOR l IN listedocument 
    LOOP 
    BEGIN 
      dbms_output.put_line (' l.coco= ' || l.coco); 
     SELECT oa.myvalue 
      INTO z_value 
      FROM schema2.table2 oa 
       INNER JOIN 
        schema1.table1 ed 
       ON ed.coco = oa.coco 
      WHERE ed.coco = l.coco 
     ; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line ('NO_DATA_FOUND'); 
    WHEN OTHERS THEN 
     dbms_output.put_line ('Exception de traitement ' || SQLERRM); 
    END; 
    END LOOP; 
END; 

这个问题似乎在这里WHERE ed.coco = l.coco 我得到的错误:异常去TRAITEMENT ORA-01008:未绑定 [==>后修改的消息]

我所有变量得到的错误:ORA-01008:并非所有的变量绑定

当我使用alter session set "_subquery_pruning_enabled"=false;一切wor ks,但表现糟糕。

我正在使用Oracle数据库11g(11.2.0.4.0)。

+1

解决我假设你在谈论“ORA-01008:未绑定的所有变量”。请不要通过将法语翻译成英语来发明新的错误信息 - 将ORA-01008放入您最喜爱的搜索引擎中将返回正确的英文字词。另外,我会对你有什么想法使用非文件化的'_subquery_pruning_enabled'参数感兴趣 - 这是从Metalink中获取的吗? –

+0

我不能看到在这种情况下使用任何绑定变量。 –

+0

你可以尝试禁用动态采样并尝试。我认为这可能会有所帮助。 alter session set optimizer_dynamic_sampling = 0 –

回答

1

看起来你可能碰到了一个错误。 请看: https://community.oracle.com/thread/3894065?start=30&tstart=0

在有些情况下优化呼叫kkpap在编译时做分区
修剪的情况。有时,分区修剪通过
对该表运行子查询完成。如果运行这些子查询所需的绑定变量值为
,那么我们不能在编译时执行修剪
。 错误14458214的修复程序解决了此问题,即子查询用于在分区级别修剪的情况。但是,它是
可能我们在分区级别使用其他方法,然后在子分区级别使用 子查询修剪;这种情况下,并没有
由修为14458214.

+0

的确,这就是我找到'_subquery_pruning_enabled'解决方案的地方。但它似乎会降低性能。另一种解决方案是将'to_number'应用于** ed.coco **,如'to_number(ed.coco)= 1。可可',但表现很糟糕,我无法解释原来的问题。 – FTK

+1

如果你有访问oracle的支持,你应该安装补丁(如果有的话)或与他们联系恕我直言 – vercelli

+1

不,我不知道,我不是DBA。但是我做了一些测试:首先,我的要求适用于其他环境。然后'schema2.table2'是一个基于DBLINK的物化视图,我使用了另一个物化视图(基于相同的DBLINK),它使用了相同的约束(oa.coco)。在用'table2 @ DBLINK'更改'schema2.table2'后,它就可以工作。所以我认为这个具体视图存在一个问题,但我不是专家来确定它是什么(分区等)...... – FTK

0
DECLARE 

    z_value NUMBER  := -1; 


coco number; 
BEGIN 
    BEGIN 
coco:=2310458; 
      dbms_output.put_line (' coco= ' || coco); 
     SELECT oa.myvalue 
      INTO z_value 
      FROM schema2.table2 oa 
       INNER JOIN 
        schema1.table1 ed 
       ON ed.coco = oa.coco 
      WHERE ed.coco = coco 
     ; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     dbms_output.put_line ('NO_DATA_FOUND'); 
    WHEN OTHERS THEN 
     dbms_output.put_line ('Exception de traitement ' || SQLERRM); 
    END; 

当你在游标中有1个变量时使用LOOP ...不是一个好主意。

+1

这并没有回答这个问题。此外,使用循环遍历1(或0)行非常好(尽管很少需要)。 –

+0

我选择了一个变量来简化我的光标。但实际上,光标获得多个值。 – FTK

相关问题