在一张表中 delete多条数据,
也就是说,一个表中有4个pk,用三个pk为条件删除时,报ora-00936比如 表AAA里有,a,b,c,d 四个pkdelete from AAA 
where a='1'
and b='2' 
and c='3'

解决方案 »

  1.   


    我没说清楚, 在pl/sql里执行的时候,不是报ora-00936,而是一直在执行中,过了很长时间也没反映在那条sql语句在加上一个条件时(把4个pk都加上条件时),执行的很正常报ora-00936是把这条sql存储过程来执行的时候报出来的。。*数据量不大在满足三个pk条件的数据7~8条
      

  2.   

    delete AAA
    where a='1'
    and b='2'
    and c='3'
      

  3.   

    估计是和哪个Session有共享锁冲突
      

  4.   


    应该不是把。。如果那样的话,4个pk都给也一个道理,应该删不掉才是
    但pk都给的时候很正常
      

  5.   

    个人觉得可能跟索引有关 你看看执行计划看看
    --拿emp表来举例 empno为主键 ename不是
    scott@YPCOST> delete from emp where ename='aspen';1 row deleted.
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 161811703---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | DELETE STATEMENT   |      |     1 |    13 |     3   (0)| 00:00:01 |
    |   1 |  DELETE            | EMP  |       |       |            |          |
    |*  2 |   TABLE ACCESS FULL| EMP  |     1 |    13 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   2 - filter("ENAME"='aspen')scott@YPCOST> rollback;Rollback complete.scott@YPCOST> delete from emp where empno=7777;1 row deleted.
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3381662193----------------------------------------------------------------------------------------------------
    | Id  | Operation          | Name                           | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------------------
    |   0 | DELETE STATEMENT   |                                |     1 |     7 |     1   (0)| 00:00:01 |
    |   1 |  DELETE            | EMP                            |       |       |            |          |
    |*  2 |   INDEX UNIQUE SCAN| BIN$btQk2mJNTzWasNJXoOSNnw==$2 |     1 |     7 |     0   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   2 - access("EMPNO"=7777)
      

  6.   

    zhuomingwang
     
    能详细讲一下吗?
      

  7.   

    删除首先也是要找到数据的 
    如果是用ename的话是走全部扫描 TABLE ACCESS FULL  这个是要慢一点的 
    如果是用empno的话 empno是主键 会自动创建索引 INDEX UNIQUE SCAN 这样就要快的但是删除完之后维护索引也是要废时间的
    如果你表的数据量很大 但是删除只是其中的很少很少部分的话 有索引的话 会快点
    但是如果你要删除的数据很多的话 删除之后维护索引也是要花费很多时间的就像是一个字典的目录 你按照这个来想象下
      

  8.   

    听楼主的描述,应该是性能的问题,不是语法问题
    这个表数据量有多大,a,b,c,d四个字段是联合主健吧,建立主健,同时会生成一个隐式索引
    可以看一下,主健产生的那个索引几个字段建立的顺序是什么
    索引的原则是必须是查询中用到了前面的字段,后面的字段才会走索引
    楼主看下,是不是where条件里面没用到那个字段,恰好是索引的第一个字段
    在PLSQL中,选中SQL,按F5,可以看执行计划,最好把执行计划贴出来
      

  9.   

    1.为什么查询的时候很快,但删除的时候,就没反应
    A:这就是索引的作用,提高查询速度,降低DML语句效率.详见Google.2.如果是索引的问题的话,应该查询的时候也不是通过索引来检索吗? 
      删除的时候和检索的时候用的索引不一样吗?
    A:具体得看执行计划,也可能是索引碎片造成的.可重建一下索引试试.
      

  10.   

    比如 表AAA里有,a,b,c,d 四个pkdelete from AAA 
    where a='1'
    and b='2' 
    and c='3'-- 其二:你的表AAA中的三个字段的字段类型是什么?
    -- 将下面语句执行的结果贴出来看一下:
    -- (如果是数值类型,where条件中的引号就不需要,即修改为:where a=1...)
    -- 如果你打引号,会产生隐式类型转换!
    -- 详细请参考:http://topic.csdn.net/u/20110323/13/43a9766c-9a40-470d-8adb-9c2594282203.html
    desc AAA;
      

  11.   

    我和楼主遇到过差不多相同的问题,我的问题是查询的时候很快,但是放到过程中执行insert的时候会很慢,但至今没找出问题所在,哎但看楼主的情况(数据少、查询简单)似乎不应该出现,分析下表和索引试试看。
    analyze table tablename compute statistics;
    analyze index indexname compute statistics;
      

  12.   


    ORA-00936: 缺少表达式在过程里面执行时应这么写:
    delete from AAA  
    where a='1' and
          b='2' and
          c='3' and
          d='4';