记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

Oracle通过PLSQL+游标删除大量创建的对象


1,由于执行大量SQL脚本时,非发现通过SYSTEM账号执行的,所以创建了很多对像objects,本应是创建在其它账号模式下的,所以需要删除。但是创建的资源比较多,靠手动清理,会有遗留。

2,这里就想到先查出时间点内创建的对象,再通过PLSQL来删除掉。

3,查看今天创建的对象,确认都是需要删除的,使用以下命令:

        SELECT o.OBJECT_NAME, o.OBJECT_TYPE
          FROM all_objects o
         WHERE     o.CREATED > TO_DATE ('2022-08-06', 'yyyy-mm-dd')
               AND o.OWNER = 'SYSTEM' ;

4,发现在TABLE,INDEX, SEQUENCE三种类型,由于INDEX索引只是依附表的,所以只需要删除TABLE与SEQUENC,就可以了。

具体PLSQL内容如下:


DECLARE
    CURSOR cur_d_oj IS
          SELECT o.OBJECT_NAME, o.OBJECT_TYPE
            FROM all_objects o
           WHERE     o.CREATED > TO_DATE ('2022-08-06', 'yyyy-mm-dd')
                 AND o.OWNER = 'SYSTEM'
        ORDER BY 2;


    c_d   cur_d_oj%ROWTYPE;
BEGIN
    OPEN cur_d_oj;


    LOOP
        FETCH cur_d_oj INTO c_d;


        EXIT WHEN cur_d_oj%NOTFOUND;


        CASE
            WHEN c_d.object_type = 'TABLE'
            THEN
                EXECUTE IMMEDIATE   'DROP '
                                 || c_d.object_type
                                 || ' '
                                 || c_d.object_name
                                 || ' cascade constraints';


                DBMS_OUTPUT.put_line (
                       c_d.object_name
                    || ' 的类型是: '
                    || c_d.object_type
                    || ', 删除成功');
            WHEN c_d.object_type = 'SEQUENCE'
            THEN
                EXECUTE IMMEDIATE   'DROP '
                                 || c_d.object_type
                                 || ' '
                                 || c_d.object_name;


                DBMS_OUTPUT.put_line (
                       c_d.object_name
                    || ' 的类型是: '
                    || c_d.object_type
                    || ', 删除成功');
            ELSE
                DBMS_OUTPUT.put_line (
                       c_d.object_name
                    || ' 的类型是: '
                    || c_d.object_type
                    || ', 不需要删除');
        END CASE;
    END LOOP;


    CLOSE cur_d_oj;


    COMMIT;
END;
/



转载请标明出处【Oracle通过PLSQL+游标删除大量创建的对象】。

《www.92cto.com》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论