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;
/
/
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;
/
解决方案 »
- 求自动结出余额的问题
- 关于调用问题(O_O)???
- oracle存储过程#号的疑问
- oracle字段截取问题,求救高手。
- 各位大侠,请问一个登陆oracle的问题,谢谢各位了
- OracleOraHome90TNSListener为什么会自动停止呢?
- [que]此方法是否安全??我实践过,好用,但是担心不安全?
- 昨天都没有问题,也没有改程序,怎么会提示出错呢?救我!!!!!!!!!!!!1
- 急~~ORA-01031: insufficient privileges错误~
- 如何提高批量insert效率
- to:bzszp(SongZip),再求一sql语句,谢谢!
- 我就想看看我同事机上的数据,局域网内部发给我一个工具,网上我不会找,给我一个HTTP地址也可
直接在delete里面加上条件就可以了啊
这个时隐式的open以及close
不用显示的进行控制,当然也不会对系统有什么影响。
delete from test where a like (select * from bad_word where wstr like '%xx%');
where instr(a,wstr)>0);
where instr(字段,'国家')>0);
这样就可以了,不用游标了
delete from test where exists (select 字段 from bad_word
where instr(字段,'国家')>0);如果敏感词是'国家','共产党','国务院','中央军委'等一些列词的时候如何处理这样一个问题?
where instr(a,wstr)>0);
这条语句是可以处理这种情况的。
显示
SQL> print jobno;
SP2-0552: 未说明结合变量"JOBNO"没有JOBNO 我无法执行exec dbms_job.broken(41,true);怎么办?
看一下是那个job号
然后在执行上面的broken语句。
JOB WHAT
-------------------------
41 dele_test;43 dele_test;44 dele_test;45 dele_test;46 dele_test;
可是报告我权限不够
exec dbms_job.remove(41);
?
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);
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;这个存储过程不能编译,我无法找到原因,请您帮助排错一下,谢了!
另外,列出bad_word的表结构。
没有错误。
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
没有错误。
换成
v_bad_word.key_word
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' 组件
delete from test where a like '%' ¦ ¦v_bad_word.wstr ¦ ¦'%';
里面的wstr为key_word!
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||'%';
编译通过了,正确吗?
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)
where exists(
select key_word from bad_word
where instr(a,key_word)>0
or instr(b,key_word)>0
);
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,我怎么写这个语句?谢谢!