我正在学习数据库类,在课程实验部分的开头,我们通常必须删除之前创建的数据库中的所有表。我希望能够运行一个动态执行此操作的脚本,但似乎无法使其工作。这是我到目前为止的代码。
declare tname string(50);
cursor ctable is select table_name from user_tables;
begin
open ctable;
LOOP
FETCH ctable into tname;
if tname != '' then
execute immediate 'drop table ' || tname;
END if;
EXIT WHEN ctable%NOTFOUND;
END LOOP;
close ctable;
end;
如果有人可以指出我正确的方向,我做错了什么就行了。感谢。
答案 0 :(得分:5)
Oracle的VARCHAR2
将空字符串视为NULL
。
所以
if tname != '' then
与
相同if tname != NULL then
将返回NULL
而不是TRUE
,因为它未定义。
您可以NULL
检查tname IS NOT NULL
。
table_name
在user_tables
中是强制性的,因此无需进行此项检查。
还有两件事:
%NOTFOUND
user_tables.table_name%TYPE
)所以你的代码看起来像那样:
DECLARE
tname user_tables.table_name%TYPE;
CURSOR ctable IS SELECT table_name FROM user_tables;
BEGIN
OPEN ctable;
LOOP
FETCH ctable INTO tname;
EXIT WHEN ctable%NOTFOUND;
EXECUTE IMMEDIATE 'drop table ' || tname;
END LOOP;
CLOSE ctable;
END;
您还可以使用隐式游标来提高可读性:
BEGIN
FOR cur IN ( SELECT table_name FROM user_tables ) LOOP
EXECUTE IMMEDIATE 'drop table ' || cur.table_name;
END LOOP;
END;