Oracle PL/SQL:在创建表之前,检查模式中是否有足够的空间
我正在使用一个过程,该过程使用一个繁重的查询(运行~1小时)创建一个表。查询类似于“从表中选择*”,表中的列可以更改。 通常情况下,在模式中没有可用空间来创建表,因此我得到一个异常,时间是徒劳的,我需要再次执行相同的计算 我得到的错误是: ORA-01536:超出表空间的空间配额 ORA-06512:“更新报告”,第37行 我想做的是: -将查询结果存储在游标的临时段中; -尝试使用游标创建表。在异常(空间不足)的情况下,删除一个存放表的特殊空间以释放模式中的表空间; -尝试再次从游标创建表 我尝试使用动态SQL解决这个问题,但它导致了过度复杂,而问题似乎有一个简单的解决方案。我面临的主要问题是,没有明显的方法使用游标创建表Oracle PL/SQL:在创建表之前,检查模式中是否有足够的空间,oracle,plsql,dynamic-sql,Oracle,Plsql,Dynamic Sql,我正在使用一个过程,该过程使用一个繁重的查询(运行~1小时)创建一个表。查询类似于“从表中选择*”,表中的列可以更改。 通常情况下,在模式中没有可用空间来创建表,因此我得到一个异常,时间是徒劳的,我需要再次执行相同的计算 我得到的错误是: ORA-01536:超出表空间的空间配额 ORA-06512:“更新报告”,第37行 我想做的是: -将查询结果存储在游标的临时段中; -尝试使用游标创建表。在异常(空间不足)的情况下,删除一个存放表的特殊空间以释放模式中的表空间; -尝试再次从游标创建表 我
有什么简单的解决办法我不知怎么漏掉了吗?也许光标是解决这个问题的错误方法?我能想到两件事:
- 让数据库来做这个肮脏的工作
- a、 k.a.只需看看Oracle如何管理自己,就可以享受DBA的工作
- 怎么做?让表空间自动扩展
- 将该表空间上的无限配额授予用户
我能想到两件事:
- 让数据库来做这个肮脏的工作
- a、 k.a.只需看看Oracle如何管理自己,就可以享受DBA的工作
- 怎么做?让表空间自动扩展
- 将该表空间上的无限配额授予用户
我同意@OldProgrammer——这是一个设计问题。删除和重新创建表是一种反模式 目前尚不清楚您正试图解决的确切问题,但更明智的方法可能是:
我同意@OldProgrammer——这是一个设计问题。删除和重新创建表是一种反模式 目前尚不清楚您正试图解决的确切问题,但更明智的方法可能是:
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
事件上创建架构级数据库触发器,以便在需要跳入时向他们发送电子邮件。这听起来像是设计问题。为什么要重复创建此表?一种选择是使用外部表并将查询结果写入该表。它仍将占用磁盘空间,但由操作系统而不是数据库占用。然后,您可以检查数据库大小,并从