在一张表中 delete多条数据,
也就是说,一个表中有4个pk,用三个pk为条件删除时,报ora-00936比如 表AAA里有,a,b,c,d 四个pkdelete from AAA
where a='1'
and b='2'
and c='3'
也就是说,一个表中有4个pk,用三个pk为条件删除时,报ora-00936比如 表AAA里有,a,b,c,d 四个pkdelete from AAA
where a='1'
and b='2'
and c='3'
解决方案 »
- 用语句调用调试存储过程的问题
- oracle如何写这样一条sql语句
- 请教一个序列的方法,谢谢大家
- 急!!!3天没解决的问题
- 急!字符集不同的两个oracle 8i数据库之间怎样用exp和imp进行数据导出与导入?高分相送!!!
- 高手指教:连接池问题,怎么修改connectionpool.properties文件?
- 在linux下import一个windows下建的库的DMP文件,产生了乱码!
- tnsnames.ora,sqlnet.ora,init.ora ,listener.ora分别是用来做什么的,如何配置?
- 请问oracle建表时如何实现identity(1,1)[sql server]?
- 请问在oracle中有哪个系统的表是存储所有表信息的
- 50分求sql高手写一条复杂的sql语句,会sql的都请进
- Oracle 触发器,函数,过程调用出问题了 帮帮忙
我没说清楚, 在pl/sql里执行的时候,不是报ora-00936,而是一直在执行中,过了很长时间也没反映在那条sql语句在加上一个条件时(把4个pk都加上条件时),执行的很正常报ora-00936是把这条sql存储过程来执行的时候报出来的。。*数据量不大在满足三个pk条件的数据7~8条
where a='1'
and b='2'
and c='3'
应该不是把。。如果那样的话,4个pk都给也一个道理,应该删不掉才是
但pk都给的时候很正常
--拿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)
能详细讲一下吗?
如果是用ename的话是走全部扫描 TABLE ACCESS FULL 这个是要慢一点的
如果是用empno的话 empno是主键 会自动创建索引 INDEX UNIQUE SCAN 这样就要快的但是删除完之后维护索引也是要废时间的
如果你表的数据量很大 但是删除只是其中的很少很少部分的话 有索引的话 会快点
但是如果你要删除的数据很多的话 删除之后维护索引也是要花费很多时间的就像是一个字典的目录 你按照这个来想象下
这个表数据量有多大,a,b,c,d四个字段是联合主健吧,建立主健,同时会生成一个隐式索引
可以看一下,主健产生的那个索引几个字段建立的顺序是什么
索引的原则是必须是查询中用到了前面的字段,后面的字段才会走索引
楼主看下,是不是where条件里面没用到那个字段,恰好是索引的第一个字段
在PLSQL中,选中SQL,按F5,可以看执行计划,最好把执行计划贴出来
A:这就是索引的作用,提高查询速度,降低DML语句效率.详见Google.2.如果是索引的问题的话,应该查询的时候也不是通过索引来检索吗?
删除的时候和检索的时候用的索引不一样吗?
A:具体得看执行计划,也可能是索引碎片造成的.可重建一下索引试试.
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;
analyze table tablename compute statistics;
analyze index indexname compute statistics;
ORA-00936: 缺少表达式在过程里面执行时应这么写:
delete from AAA
where a='1' and
b='2' and
c='3' and
d='4';