delete from sc_tt_stock s
where s.sc_tm_warehouse_id = 1018626;我执行这条sql,一直没反应。。请问怎么解决呢/?谢谢大家了。。

解决方案 »

  1.   

    s.sc_tm_warehouse_id = 1018626
    这条记录数据库里有吗?如果有的话,需要Commit;Delete、Update、Insert这三条语执行后要Commit;才会做用到表里。
      

  2.   

    什么叫没反应?
    表sc_tt_stock数据量很大?
    如果数据量很大,查看一下字段sc_tm_warehouse_id是主键吗,有索引吗?
    确认一下sc_tm_warehouse_id是什么类型?
    如果是varchar2,且有索引,则加上引号才能使用上索引
    delete from sc_tt_stock s
    where s.sc_tm_warehouse_id = '1018626';最好查看一下执行计划!
      

  3.   

    s.sc_tm_warehouse_id  是外键
      

  4.   


    delete from sc_tt_stock s
    where s.sc_tt_stock_id = 342435;
    我这样删除一条数据也删不掉
    删除s.sc_tm_warehouse_id = 1018626该门店的库存记录都删不掉。。
      

  5.   

    跟你说了,你通过v$locked_object 和 v$session查看下你sc_tt_stock表是否被其它session锁住了
    如果锁住了,你肯定就不能删除,只能等待那个session事务提交或回滚你才能做
    找到那个sid,然后kill掉
      

  6.   

    你看下是不是有SQL语句还在执行,你删除要commit的
    下面是查询系统正在运行的SQL语句,你检查下,,,select a.program,b.spid,c.sql_text from v$session a,v$process b,v$sqlarea c where a.paddr=b.addr and a.sql_hash_value=c.hash_value  and a.username is not null;
      

  7.   

    谢谢潘哥,估价是行级锁住了。我这个warehouse的数据都删不了。。
    但要怎么执行,怎么kill掉呢
    不懂啊。。还请指教。。
    select v$locked_object from dual;--???执行不了
      

  8.   


    --首先查看有哪些锁
    select /*+ rule */ s.username,
          decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level,
          o.owner,
          o.object_name,
          o.object_type,
          s.sid,s.serial#,
          s.terminal,
          s.machine,
          s.program,
          s.osuser
    from v$session s,v$lock l,dba_objects o
    where l.sid = s.sid
    and l.id1 = o.object_id(+)
    and s.username is not null--如果发生了锁等待,看是谁锁了表而引起谁的等待
    --以下的语句可以查询到谁锁了表,而谁在等待。 如果有子节点,则表示有等待发生
    select /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name,
           o.owner,
           o.object_name,
           o.object_type,
           s.sid,
           s.serial#
    from v$locked_object l,dba_objects o,v$session s
    where l.object_id=o.object_id
    and l.session_id=s.sid
    order by o.object_id,xidusn desc
    --找到引起等待的session,杀掉该session: 
    alter system kill session 'sid,serial#';
      

  9.   

    谢谢潘哥哈~~~还是有点疑问--首先查看有哪些锁
    select /*+ rule */ s.username,
          decode(l.type,'TM','TABLE LOCK','TX','ROW LOCK',null) lock_level,
          o.owner,
          o.object_name,
          o.object_type,
          s.sid,s.serial#,
          s.terminal,
          s.machine,
          s.program,
          s.osuser
    from v$session s,v$lock l,dba_objects o
    where l.sid = s.sid
    and l.id1 = o.object_id(+)
    and s.username is not null--执行结果只有1条
    --1 CRP ROW LOCK null null null 554 53236 LENOVO-C1E06E80 WORKGROUP\LENOVO-C1E06E80 plsqldev.exe Administrator--如果发生了锁等待,看是谁锁了表而引起谁的等待
    --以下的语句可以查询到谁锁了表,而谁在等待。 如果有子节点,则表示有等待发生
    --这条sql执行结果是0rows
      

  10.   


    alter system kill session '554,53236';我执行该sql后,已经没有锁了。。
    再执行delete from sc_tt_stock s
    where s.sc_tm_warehouse_id = 1018626;还是执行不过去,一直显示:Executing
      

  11.   

    delete sc_tt_stock where sc_tm_warehouse_id = '1018626';
    commit
      

  12.   

    那就说明不是锁引起你的delete语句等待的问题,
    我可能猜到你的原因了,你外健是不是不存在索引!
    由于你delete会对从表进行施加行级锁,但是从表的外健是No action,oracle在删除主表的时候会去寻找所有以主表的主键作为外键的数据表,然后去看从表是否有该外键的索引,如果没有则会对整个从表施加表级锁,然后对从表进行全表扫描。当然如果从表存在外键的索引,会去访问对应的索引,而不会对从表本身进行加锁。
      

  13.   

    谢谢潘哥。。那怎么解决呢?我用PK键做where查询语句进行删除也是不行。delete from sc_tt_stock s
    where s.sc_tt_stock_id = 342435;