oracle PLSQL,游标,loop循环删除部分表方法。 |
发表者:admin分类:数据库2020-08-07 14:32:33 阅读[1252] |
oracle PLSQL,游标,loop循环删除部分表方法。
使用Toad for Oracle时,使用新建用户连接时,连接身份 搞成了 as sysdba,
导致执行添加表与表数据时,都变成sys账号下了。
表比较多,删除时使用游标与loop循环,执行不成功。
不清楚哪里不对(主要是水平太次,)。
如下:
declareCURSOR 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》
虚拟化云计算,系统运维,安全技术服务.
Tags: | [阅读全文...] |
最新评论