我正在使用一个过程,该过程使用繁重的查询(运行〜1 hr)来创建表。查询类似于“从表中选择*”,表中的列可以更改。通常,事实证明,架构中没有可用空间来创建表,因此我得到了一个例外,这是徒劳的时间,我需要再次进行相同的计算。
我想做的是:-将查询结果存储在光标的临时段中;-尝试使用光标创建表。如果发生异常(空间不足),请删除一个特殊的空间保存表以释放架构中的表空间;-尝试从光标再次创建表。
我曾尝试使用动态SQL解决此问题,但这会导致复杂化,而问题似乎有一个简单的解决方案。我面临的主要问题是没有明显的方法可以使用游标创建表。
我有某种简单的解决方案会以某种方式错过吗?也许光标是解决此问题的错误方法?
我能想到的两件事:
这里(以特权用户身份连接):
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-这是一个设计问题。删除和重新创建表是一种反模式。
我想做的:-将查询结果存储在游标中的临时段中; -尝试使用光标创建表。如果发生异常(空间不足),请删除一个特殊的空间保存表以释放架构中的表空间; -尝试从光标再次创建表。