动态游标

这是一个删除一个实例中全部表的记录的有关填表时间在一定范围内的游标!
思想:
  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;
动态与静态游定义时放在一起还有的原因:对操作范围的控制!!
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值