PL/SQL: 在创建table之前检查schema中是否有足够的space

PL/SQL: Check if there is sufficient space in schema before creating table

我正在使用一个使用大量查询(运行 ~1 小时)创建 table 的过程。查询类似于 'select * from table',table 中的列可以更改。 很多时候结果是 schema 中没有空闲的 space 来创建 table,所以我得到一个异常,时间白费了,我需要再次做同样的计算。

我得到的错误:

ORA-01536: space quota exceeded for tablespace ORA-06512: at "UPDATE_REPORT", line 37

我想做的事情: - 将查询的结果存储在游标的临时段中; - 尝试使用光标创建 table。在异常的情况下(space 不够),删除一个特殊的 space-holding table 以释放模式中的 table space; - 尝试从光标再次创建 table。

我尝试使用动态 SQL 来解决这个问题,但它会导致过于复杂,而这个问题似乎有一个简单的解决方案。我面临的主要问题是没有明显的方法可以使用游标创建 table。

是否有任何我不知何故错过的简单解决方案?也许光标是解决这个问题的错误方法?

我能想到的两件事:

  • 让数据库来做脏活
    • a.k.a。 享受您的 DBA 工作,只需看看 Oracle 自我管理
    • 怎么样?让表空间自动扩展
  • 向用户
  • 授予该表空间的无限配额

方法如下(以特权用户身份连接):

SQL> select file_name, tablespace_name From dba_data_files;

FILE_NAME                                        TABLESPACE_NAME
------------------------------------------------ -----------------------------
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF      USERS
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSAUX.DBF     SYSAUX
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\UNDOTBS1.DBF   UNDOTBS1
C:\ORACLEXE\APP\ORACLE\ORADATA\XE\SYSTEM.DBF     SYSTEM

SQL> alter database datafile 'C:\ORACLEXE\APP\ORACLE\ORADATA\XE\USERS.DBF'
  2  autoextend on
  3  maxsize unlimited;

Database altered.

SQL> alter user scott quota unlimited on users;

User altered.

SQL>

我同意@OldProgrammer - 这是一个设计问题。删除并重新创建 tables 是一种反模式。

不清楚您要解决的具体问题是什么,但更明智的方法可能是:

  1. 创建 table 一次。使用 INITIAL EXTENT 参数确保 table 具有它需要的所有 space(您可能需要 运行 一些查询来确定该数字应该是什么)。
  2. 请与您的 DBA 确认 tablespace 设置为 AUTOEXTEND,以防出现超出您的计算的恶意结果集。也许为架构所有者协商更多 tablespace 配额。
  3. 填充 table 一次。
  4. 在随后的 运行 之前,使用 REUSE STORAGE 子句截断 table 以保留分配的 space。

What I would want to do: - Store query's results in temporary segment in a cursor; - Try to create table using cursor. In case of exception (not enough space), drop a special space-holding table to free table space in schema; - Try to create the table again from cursor.

不要自寻烦恼。只是告诉 Oracle 不要因为 space 个问题而死。

您可以使您的会话 "resumable" 这样,当您 运行 超出 space 时,Oracle 将暂停您的会话,而不是给您一个错误,直到问题得到纠正(然后自动继续)。

假设您拥有所需的所有权限(特别是 GRANT RESUMABLE TO yourschema),您可以像这样启用它:

alter session enable resumable timeout 1800 name 'your process name, can be anything';

1800 数字以秒为单位,让您的 DBA 在会话超时之前有 30 分钟的时间来解决问题。 "my process" 将显示在 V$RESUMABLE 中,用于查询和自动提醒。

您的 DBA 可以监控 V$RESUMABLE and/or 您可以在 AFTER SUSPEND 事件上创建模式级数据库触发器,以便在他们需要跳转时向他们发送电子邮件英寸