Oracle PL/SQL:在创建表之前,检查模式中是否有足够的空间

Oracle PL/SQL:在创建表之前,检查模式中是否有足够的空间,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我正在使用一个过程,该过程使用一个繁重的查询(运行~1小时)创建一个表。查询类似于“从表中选择*”,表中的列可以更改。 通常情况下,在模式中没有可用空间来创建表,因此我得到一个异常,时间是徒劳的,我需要再次执行相同的计算 我得到的错误是: ORA-01536:超出表空间的空间配额 ORA-06512:“更新报告”,第37行 我想做的是: -将查询结果存储在游标的临时段中; -尝试使用游标创建表。在异常(空间不足)的情况下,删除一个存放表的特殊空间以释放模式中的表空间; -尝试再次从游标创建表 我

我正在使用一个过程,该过程使用一个繁重的查询(运行~1小时)创建一个表。查询类似于“从表中选择*”,表中的列可以更改。 通常情况下,在模式中没有可用空间来创建表,因此我得到一个异常,时间是徒劳的,我需要再次执行相同的计算

我得到的错误是:

ORA-01536:超出表空间的空间配额 ORA-06512:“更新报告”,第37行

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

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


有什么简单的解决办法我不知怎么漏掉了吗?也许光标是解决这个问题的错误方法?

我能想到两件事:

  • 让数据库来做这个肮脏的工作
    • a、 k.a.只需看看Oracle如何管理自己,就可以享受DBA的工作
    • 怎么做?让表空间自动扩展
  • 将该表空间上的无限配额授予用户
以下是如何(作为特权用户连接):


我能想到两件事:

  • 让数据库来做这个肮脏的工作
    • a、 k.a.只需看看Oracle如何管理自己,就可以享受DBA的工作
    • 怎么做?让表空间自动扩展
  • 将该表空间上的无限配额授予用户
以下是如何(作为特权用户连接):


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

目前尚不清楚您正试图解决的确切问题,但更明智的方法可能是:

  • 创建一次表。使用initialextent参数确保表具有所需的所有空间(您可能需要运行一些查询来确定该图应该是什么)
  • 向DBA检查表空间是否设置为AUTOEXTEND,以防出现超出计算范围的恶意结果集。可能会为模式所有者协商更多的表空间配额
  • 填充表一次
  • 在后续运行之前,请使用REUSE STORAGE子句截断表以保留分配的空间
    我同意@OldProgrammer——这是一个设计问题。删除和重新创建表是一种反模式

    目前尚不清楚您正试图解决的确切问题,但更明智的方法可能是:

  • 创建一次表。使用initialextent参数确保表具有所需的所有空间(您可能需要运行一些查询来确定该图应该是什么)
  • 向DBA检查表空间是否设置为AUTOEXTEND,以防出现超出计算范围的恶意结果集。可能会为模式所有者协商更多的表空间配额
  • 填充表一次
  • 在后续运行之前,请使用REUSE STORAGE子句截断表以保留分配的空间 我想做的是:-将查询结果存储在游标的临时段中;-尝试使用游标创建表。如果出现异常(空间不足),请删除一个容纳表的特殊空间,以释放模式中的表空间;-尝试再次从游标创建表

    别自找麻烦。告诉甲骨文不要因为空间问题而死亡

    您可以将会话设置为“可恢复”,这样,当您的空间不足时,Oracle将暂停您的会话,直到问题得到纠正(然后自动继续)

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

    alter session enable resumable timeout 1800 name 'your process name, can be anything';
    
    1800
    数字以秒为单位,在会话超时之前,DBA有30分钟的时间来解决问题。“我的流程”将显示在
    V$resubable
    中,用于查询和自动警报

    您的DBA可以监视
    V$RESUMABLE
    和/或您可以在
    AFTER SUSPEND
    事件上创建架构级数据库触发器,以便在需要跳入时向他们发送电子邮件

    我想做的是:-将查询结果存储在游标的临时段中;-尝试使用游标创建表。如果出现异常(空间不足),请删除一个容纳表的特殊空间,以释放模式中的表空间;-尝试再次从游标创建表

    别自找麻烦。告诉甲骨文不要因为空间问题而死亡

    您可以将会话设置为“可恢复”,这样,当您的空间不足时,Oracle将暂停您的会话,直到问题得到纠正(然后自动继续)

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

    alter session enable resumable timeout 1800 name 'your process name, can be anything';
    
    1800
    数字以秒为单位,在会话超时之前,DBA有30分钟的时间来解决问题。“我的流程”将显示在
    V$resubable
    中,用于查询和自动警报


    您的DBA可以监视
    V$resubable
    和/或您可以在
    AFTER SUSPEND
    事件上创建架构级数据库触发器,以便在需要跳入时向他们发送电子邮件。

    这听起来像是设计问题。为什么要重复创建此表?一种选择是使用外部表并将查询结果写入该表。它仍将占用磁盘空间,但由操作系统而不是数据库占用。然后,您可以检查数据库大小,并从