这是一个删除一个实例中全部表的记录的有关填表时间在一定范围内的游标!
思想:
1.将所有具有填报时间的表写入一个表中(insert into **** select ....)
2.使用动态游标对相应表的相应JBSJ进行删除操作
3.使用视图USER_TAB_COLUMNS
CREATE OR REPLACE PROCEDURE PRO_DELETE_ALLTBSJ
-- Created : 2006-10-10 15:24:00
-- Purpose : 删除整个数据库更新其TBSJ里的TBSJ小于一定值的
--(这个根据create table ALL_TBSJ AS select COLUMN_NAME,TABLE_NAME,DATA_TYPE FROM USER_TAB_COLUMNS WHERE COLUMN_NAME = 'TBSJ'
(
C_DeleteTime IN VARCHAR2 ---要更新单位编号
)
IS
------------------动态游标的定义
v_SQL VARCHAR2(100);
TYPE CT IS REF CURSOR;
CC CT;
v_Dnofify DATE; ----判断TBSJ为DATE TYPE
v_Cnofify VARCHAR2(500);---还是 VARCHAR2
------------------静态游标的定义
CURSOR DeleteTBSJ IS
SELECT * FROM ALL_TBSJ;
CURSOR_ALL_TBSJ ALL_TBSJ %ROWTYPE;---取出在ALL_TBSJ中表名与TBSJ字段
----
BEGIN
OPEN DeleteTBSJ;
FETCH DeleteTBSJ INTO CURSOR_ALL_TBSJ;
WHILE DeleteTBSJ %FOUND LOOP
BEGIN
IF CURSOR_ALL_TBSJ.DATA_TYPE = 'DATE' THEN ----判断TBSJ是DATE型还是字符型
OPEN CC FOR 'SELECT '||CURSOR_ALL_TBSJ.COLUMN_NAME||' FROM '||CURSOR_ALL_TBSJ.TABLE_NAME;
LOOP
FETCH CC INTO v_Dnofify;
EXIT WHEN CC%NOTFOUND;
v_SQL:='DELETE FROM '||CURSOR_ALL_TBSJ.TABLE_NAME ;
v_SQL := v_SQL ||' WHERE ' ||CURSOR_ALL_TBSJ.COLUMN_NAME;
v_SQL := v_SQL || ' >= TO_DATE('''||C_DeleteTime||''',''YYYY-MM-DD'')';
EXECUTE IMMEDIATE v_SQL;
COMMIT;
END LOOP;
CLOSE CC;
ELSE------是字符型
OPEN CC FOR 'SELECT '||CURSOR_ALL_TBSJ.COLUMN_NAME||' FROM '||CURSOR_ALL_TBSJ.TABLE_NAME;
LOOP
FETCH CC INTO v_Cnofify;
EXIT WHEN CC%NOTFOUND;
v_SQL:='DELETE FROM '||CURSOR_ALL_TBSJ.TABLE_NAME ;
v_SQL := v_SQL || ' WHERE '||CURSOR_ALL_TBSJ.COLUMN_NAME;
v_SQL := v_SQL || ' >= '''||C_DeleteTime||'''';
EXECUTE IMMEDIATE v_SQL;
COMMIT;
END LOOP;
CLOSE CC;
END IF;
END;
--------------
FETCH DeleteTBSJ INTO CURSOR_ALL_TBSJ; ---再次赋值
END LOOP;
CLOSE DeleteTBSJ;
END PRO_DELETE_ALLTBSJ;
动态与静态游定义时放在一起还有的原因:对操作范围的控制!!
思想:
1.将所有具有填报时间的表写入一个表中(insert into **** select ....)
2.使用动态游标对相应表的相应JBSJ进行删除操作
3.使用视图USER_TAB_COLUMNS
CREATE OR REPLACE PROCEDURE PRO_DELETE_ALLTBSJ
-- Created : 2006-10-10 15:24:00
-- Purpose : 删除整个数据库更新其TBSJ里的TBSJ小于一定值的
--(这个根据create table ALL_TBSJ AS select COLUMN_NAME,TABLE_NAME,DATA_TYPE FROM USER_TAB_COLUMNS WHERE COLUMN_NAME = 'TBSJ'
(
C_DeleteTime IN VARCHAR2 ---要更新单位编号
)
IS
------------------动态游标的定义
v_SQL VARCHAR2(100);
TYPE CT IS REF CURSOR;
CC CT;
v_Dnofify DATE; ----判断TBSJ为DATE TYPE
v_Cnofify VARCHAR2(500);---还是 VARCHAR2
------------------静态游标的定义
CURSOR DeleteTBSJ IS
SELECT * FROM ALL_TBSJ;
CURSOR_ALL_TBSJ ALL_TBSJ %ROWTYPE;---取出在ALL_TBSJ中表名与TBSJ字段
----
BEGIN
OPEN DeleteTBSJ;
FETCH DeleteTBSJ INTO CURSOR_ALL_TBSJ;
WHILE DeleteTBSJ %FOUND LOOP
BEGIN
IF CURSOR_ALL_TBSJ.DATA_TYPE = 'DATE' THEN ----判断TBSJ是DATE型还是字符型
OPEN CC FOR 'SELECT '||CURSOR_ALL_TBSJ.COLUMN_NAME||' FROM '||CURSOR_ALL_TBSJ.TABLE_NAME;
LOOP
FETCH CC INTO v_Dnofify;
EXIT WHEN CC%NOTFOUND;
v_SQL:='DELETE FROM '||CURSOR_ALL_TBSJ.TABLE_NAME ;
v_SQL := v_SQL ||' WHERE ' ||CURSOR_ALL_TBSJ.COLUMN_NAME;
v_SQL := v_SQL || ' >= TO_DATE('''||C_DeleteTime||''',''YYYY-MM-DD'')';
EXECUTE IMMEDIATE v_SQL;
COMMIT;
END LOOP;
CLOSE CC;
ELSE------是字符型
OPEN CC FOR 'SELECT '||CURSOR_ALL_TBSJ.COLUMN_NAME||' FROM '||CURSOR_ALL_TBSJ.TABLE_NAME;
LOOP
FETCH CC INTO v_Cnofify;
EXIT WHEN CC%NOTFOUND;
v_SQL:='DELETE FROM '||CURSOR_ALL_TBSJ.TABLE_NAME ;
v_SQL := v_SQL || ' WHERE '||CURSOR_ALL_TBSJ.COLUMN_NAME;
v_SQL := v_SQL || ' >= '''||C_DeleteTime||'''';
EXECUTE IMMEDIATE v_SQL;
COMMIT;
END LOOP;
CLOSE CC;
END IF;
END;
--------------
FETCH DeleteTBSJ INTO CURSOR_ALL_TBSJ; ---再次赋值
END LOOP;
CLOSE DeleteTBSJ;
END PRO_DELETE_ALLTBSJ;
动态与静态游定义时放在一起还有的原因:对操作范围的控制!!