如果不存在,则删除表空间。

5

我写了一个 PL/SQL 脚本(能用,但不够优美):

DECLARE
   v_exists NUMBER;
BEGIN
   SELECT count(*) INTO v_exists FROM dba_tablespaces WHERE tablespace_name = 'hr_test';
   IF v_exists > 0 THEN
   BEGIN
      EXECUTE IMMEDIATE 'DROP TABLESPACE hr_test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS';
   END;
   END IF;
   EXECUTE IMMEDIATE 'CREATE TABLESPACE hr_RJ DATAFILE ''E:\hr_test_01.dbf'' SIZE 16M';
END;

有没有一种方法可以在不使用 EXECUTE IMMEDIATE 的情况下重写此脚本?

更好的方法是根本不运行 SELECT count(*) - 只需运行 DROP 并处理引发的“tablespace not found”异常。 - Jeffrey Kemp
1个回答

6

不可以在静态PL/SQL中发出DDL语句。

但是,对于DDL目的,使用本地动态SQL是完全可以的:

在以下情况下需要使用动态SQL:

您想执行SQL数据定义语句(例如CREATE)、数据控制语句(例如GRANT)或会话控制语句(例如ALTER SESSION)。在PL/SQL中,这些语句无法以静态方式执行。

Oracle动态SQL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接