【问题标题】:Dynamically creating and executing sql commands in oracleoracle中动态创建和执行sql命令
【发布时间】:2011-01-18 01:13:31
【问题描述】:

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

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;

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

【问题讨论】:

    标签: sql oracle plsql cursor dynamic-sql


    【解决方案1】:

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

    if tname != '' then
    

    相同
    if tname != NULL then
    

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

    您可以通过tname IS NOT NULL查看NULL

    table_nameuser_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;
    

    【讨论】:

    • 你看起来很简单。我争论是否要发布这个问题,因为我知道这很简单。 pl-sql 网上没有好的资源。谢谢。
    • 不客气。看起来 StackOverflow 可能是一个很好的资源:)
    • 如果您使用外键约束,您需要在生成的命令后附加`级联约束`,否则 DROP 命令对于引用的表将失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2014-04-08
    相关资源
    最近更新 更多