1

我正在学习数据库课程,在课程的实验部分开始时,我们通常必须删除之前创建的数据库中的所有表。我希望能够运行一个动态执行此操作的脚本,但似乎无法使其正常工作。这是我到目前为止的代码。

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;

如果有人能指出我做错了什么的正确方向,那就太好了。谢谢。

4

1 回答 1

5

OracleVARCHAR2将空字符串视为NULL.
所以

if tname != '' then

是相同的

if tname != NULL then

它将返回NULL而不是TRUE因为它没有被定义。

您可以NULL通过tname IS NOT NULL.

table_name虽然是强制性的user_tables,所以不需要这个检查。


还有两件事:

  1. %NOTFOUND提取后立即检查
  2. 如果可能,对变量声明使用列引用 ( 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;
于 2010-02-17T20:23:24.173 回答