create table bad_word(wstr varchar2(20));
/
CREATE OR REPLACE  PROCEDURE  DELE_TEST  as 
cursor c_bad_word is select * from bad_word; 
begin 
 for v_bad_word in c_bad_word loop 
 delete  from  test  where  a  like  '%'||v_bad_word.wstr||'%';  
 end loop;
 commit;
exception when others then
 rollback;  
end  dele_test;
/

解决方案 »

  1.   

    如果你都要建立了一张敏感词表,就没有必要用什么游标了
    直接在delete里面加上条件就可以了啊
      

  2.   

    zmgowin 您有什么更好的解决办法?
      

  3.   

    bzszp(SongZip) 忘记告诉您了,敏感词表有标题和内容字段,所以您的cursor c_bad_word is select * from bad_word; 取出多条可以吗?另外,没看到您的游标关闭,会不会对系统性能有影响,当然这个存储过程是隔几分钟就执行一次,又没有必要关闭游标?
      

  4.   

    可以。
    这个时隐式的open以及close
    不用显示的进行控制,当然也不会对系统有什么影响。
      

  5.   

    zmgowin(隐者(龙祖宗)) 您的办法是不是进行这样的更改这个语句
    delete  from  test  where  a  like  (select * from bad_word where wstr like '%xx%');
      

  6.   

    delete from test where exists (select 1 from bad_word 
    where instr(a,wstr)>0);
      

  7.   

    delete from test where exists (select 字段 from bad_word 
    where instr(字段,'国家')>0);
    这样就可以了,不用游标了
      

  8.   

    bzszp(SongZip) 我觉得还是您给的游标好,您说呢?
      

  9.   

    bluelamb(bluelamb) 敏感词不是唯一的,要不用游标无法取出来的,bad_word是一个表,里面记录了若干个敏感词,而‘国家’仅仅是其中的一种,您这种办法我感觉是不是只能过滤特定词汇的,那么当敏感词增加的时候这个语句就没有灵活性了。
      

  10.   

    bluelamb(bluelamb) 您说的对,语句中
    delete from test where exists (select 字段 from bad_word 
    where instr(字段,'国家')>0);如果敏感词是'国家','共产党','国务院','中央军委'等一些列词的时候如何处理这样一个问题?
      

  11.   

    delete from test where exists (select 1 from bad_word    
    where instr(a,wstr)>0);  
    这条语句是可以处理这种情况的。
      

  12.   

    坏了,我忘记昨天做的存储过程的 jobno;了,今天想把它停止下来,可是用print jobno;
    显示
    SQL> print jobno;
    SP2-0552: 未说明结合变量"JOBNO"没有JOBNO 我无法执行exec dbms_job.broken(41,true);怎么办?
      

  13.   

    select job,what from all_jobs;
    看一下是那个job号
    然后在执行上面的broken语句。
      

  14.   

    糟糕,怎么里面那么多,我想把他们全部删除
      JOB             WHAT
    -------------------------
    41           dele_test;43           dele_test;44           dele_test;45           dele_test;46           dele_test;
    可是报告我权限不够
      

  15.   

    执行的是
    exec dbms_job.remove(41);
    ?
      

  16.   

    delete from test where exists (select 1 from bad_word    
    where instr(a,wstr)>0);  这个语句中的select 1 ,其中 1 是代表敏感词表的字段wstr 是吗?a 是test的一个字段(类似于标题title),可是我需要从test中还要取出b字段(正文content)这个语句是不是要改写成delete from test where exists (select 1 from bad_word    
     where instr(a,wstr)>0) or instr(b,wstr)>0);  
      

  17.   

    CREATE OR REPLACE  PROCEDURE  DELE_TEST  as 
    cursor c_bad_word is select * from bad_word; 
    begin 
     for v_bad_word in c_bad_word loop 
     delete  from  test  where  a  like  '%'||v_bad_word.wstr||'%';  
     end loop;
     commit;
    exception when others then
     rollback;  
    end  dele_test;这个存储过程不能编译,我无法找到原因,请您帮助排错一下,谢了!
      

  18.   

    用show error命令查看错误信息
    另外,列出bad_word的表结构。
      

  19.   

    SQL> show error
    没有错误。
    SQL> desc bad_word
     名称                                      空?      类型
     ----------------------------------------- -------- ----------------------------
     ID                                        NOT NULL NUMBER(10)
     KEY_WORD                                  NOT NULL VARCHAR2(80)SQL> CREATE OR REPLACE  PROCEDURE "WZW_TEST"."DELE_TEST_1"  as 
      2  cursor c_bad_word is select * from bad_word; 
      3  begin 
      4   for v_bad_word in c_bad_word loop 
      5   delete  from  test  where  a  like  '%'||v_bad_word.wstr||'%'; 
      6   end loop;
      7   commit;
      8  exception when others then
      9   rollback;  
     10  end  dele_test; 
     11  /警告: 创建的过程带有编译错误。SQL> show error
    没有错误。
      

  20.   

    v_bad_word.wstr  
    换成
    v_bad_word.key_word
      

  21.   

    还是不行啊SQL> CREATE OR REPLACE  PROCEDURE  DELE_TEST  as 
      2  cursor c_bad_word is select * from bad_word; 
      3  begin 
      4   for v_bad_word in c_bad_word loop 
      5   delete  from  test  where  a  like  '%'||v_bad_word.wstr||'%'; 
      6   end loop;
      7   commit;
      8  exception when others then
      9   rollback;  
     10  end  dele_test;
     11  /警告: 创建的过程带有编译错误。SQL> show error
    PROCEDURE DELE_TEST 出现错误:LINE/COL ERROR
    -------- ------------------------------------------------------------
    5/2      PL/SQL: SQL Statement ignored
    5/43     PL/SQL: ORA-00904: "V_BAD_WORD"."WSTR": 无效的标识符
    5/54     PLS-00302: 必须说明 'WSTR' 组件
      

  22.   

    我说的是更改
    delete    from    test    where    a    like    '%'  ¦  ¦v_bad_word.wstr  ¦  ¦'%';    
       
    里面的wstr为key_word!
      

  23.   

    CREATE OR REPLACE  PROCEDURE  DELE_TEST_1  as 
    cursor c_bad_word is select * from bad_word; 
    begin 
     for v_bad_word in c_bad_word loop 
     delete  from  test  where  a  like  '%'||v_bad_word.key_word||'%';  
     end loop;
     commit;
    exception when others then
     rollback;  
    end  dele_test_1;
    /我把原来like  '%'||v_bad_word.wstr||'%'; 变成了like  '%'||v_bad_word.key_word||'%';
    编译通过了,正确吗?
      

  24.   

    不用游标的错误产生,如何排除?SQL>  CREATE OR REPLACE  PROCEDURE  "WZW_TEST"."DELE_TEST_2" as
      2    begin
      3     delete from test where exists(select key_word from bad_word    
      4      where instr(a,key_word)>0) or instr(b,key_word)>0); 
      5     commit;
      6    end DELE_TEST_2; 
      7  /警告: 创建的过程带有编译错误。SQL> show error
    没有错误。
    SQL> desc test
     名称                                      空?      类型
     ----------------------------------------- -------- ----------------------------
     A                                         NOT NULL VARCHAR2(10)
     B                                         NOT NULL VARCHAR2(10)
     C                                         NOT NULL VARCHAR2(10)
    SQL> desc bad_word
     名称                                      空?      类型
     ----------------------------------------- -------- ----------------------------
     ID                                        NOT NULL NUMBER(10)
     KEY_WORD                                  NOT NULL VARCHAR2(80)
      

  25.   

    delete from test  
    where exists(
    select key_word  from  bad_word    
    where instr(a,key_word)>0  
    or instr(b,key_word)>0
    );    
      

  26.   

    你好,结贴不能问了,我在这里问您
    CREATE OR REPLACE  PROCEDURE  DELETE_BAD_WORD  AS 
    CURSOR C_BAD_WORD IS SELECT * FROM BAD_WORD; 
    BEGIN 
     FOR V_BAD_WORD IN C_BAD_WORD LOOP 
     DELETE  FROM  LEAVE_WORD  WHERE  TITLE  LIKE  '%'||V_BAD_WORD.KEY_WORD||'%';  
     END LOOP;
     COMMIT;
    EXCEPTION WHEN OTHERS THEN
     ROLLBACK;  
    END  DELETE_BAD_WORD;
    /这个里面,我现在的关键字段不仅是TITLE ,还有CONTENT,我怎么写这个语句?谢谢!