在oracle中动态创建和执行sql命令

时间:2010-02-17 20:20:02

标签: sql oracle plsql cursor dynamic-sql

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

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;

如果有人可以指出我正确的方向,我做错了什么就行了。感谢。

1 个答案:

答案 0 :(得分:5)

Oracle的VARCHAR2将空字符串视为NULL
所以

if tname != '' then

相同
if tname != NULL then

将返回NULL而不是TRUE,因为它未定义。

您可以NULL检查tname IS NOT NULL

table_nameuser_tables中是强制性的,因此无需进行此项检查。


还有两件事:

  1. 提取后立即检查%NOTFOUND
  2. 如果可能,使用列引用作为变量声明(user_tables.table_name%TYPE
  3. 所以你的代码看起来像那样:

    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;