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

oracle PLSQL,游标,loop循环删除部分表方法。


使用Toad for Oracle时,使用新建用户连接时,连接身份 搞成了 as sysdba,

导致执行添加表与表数据时,都变成sys账号下了。

表比较多,删除时使用游标与loop循环,执行不成功。

不清楚哪里不对(主要是水平太次,偷笑)。

如下:

declare
  CURSOR d_cursor is
    SELECT OBJECT_NAME
      FROM sys.DBA_objects
     WHERE OBJECT_TYPE = 'TABLE'
       AND owner = 'STUDENT';
  d_record d_cursor%ROWTYPE;
begin
  OPEN d_cursor;
  LOOP
    FETCH d_cursor
      INTO d_record;
    EXIT WHEN d_cursor%NOTFOUND;
    execute immediate 'DROP TABLE ' || d_record.object_name || ' cascade constraints';
    Dbms_Output.put_line(d_record.object_name || ' 表删除成功');
  end loop;
  close d_cursor;
  commit;
end;
/
行 2 出错
ORA-00942: 表或视图不存在
ORA-06512: 在 line 19


脚本已在第 2行终止。


(搞了很久才清楚,在sys或system账号会话连接中,只要添加 execute immediate这一行,就会报错误。

换成要删除的表所有账号下,执行下面命令才可以正常运行。应该是找不到dba_objects这个表,其它账号system可能没有权限。)

 
DECLARE
   CURSOR d_cursor
   IS
      SELECT UO.OBJECT_NAME
        FROM USER_OBJECTS uo
       WHERE UO.OBJECT_TYPE = 'TABLE';
   d_record   d_cursor%ROWTYPE;
BEGIN
   OPEN d_cursor;
   LOOP
      FETCH d_cursor INTO d_record;
      EXIT WHEN d_cursor%NOTFOUND;
      EXECUTE IMMEDIATE
         'DROP TABLE ' || d_record.object_name || ' cascade constraints';


      DBMS_OUTPUT.put_line (d_record.object_name || ' 表删除成功');
   END LOOP;

   CLOSE d_cursor;
   COMMIT;
END;




好在还有其它方法。使用PLSQL加for in loop 来,也是可以成功的。


DECLARE
   i   VARCHAR2 (3000);
BEGIN
   FOR i
      IN (SELECT UO.OBJECT_NAME
               FROM USER_OBJECTS uo
              WHERE UO.OBJECT_TYPE = 'TABLE')
   LOOP
      EXECUTE IMMEDIATE
         'drop TABLE ' || i.object_name || ' cascade constraints';


      DBMS_OUTPUT.put_line (i.object_name || '表删除成功');
   END LOOP;
END;


注意: 需要在表所在用户会话中执行以上命令,才能正常执行。







转载请标明出处【oracle PLSQL,游标,loop循环删除部分表方法。】。

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

网站已经关闭评论