我有Oracle程序,它包含一些EXECUTE IMMEDIATE块。其中之一 - 加入两个大表(约100-200,000,000条记录):
v_sql:='create table idb.cm_contact_add_char_exp_tmp as
select ch.* from idb.cm_contact_add_char_exp ch join
idb.communication_contact_exp_tmp cont on cont.customer_rk=ch.customer_rk and ch.RESPONSE_TRACK_CD=cont.RESPONSE_TRACK_CD'
execute immediate v_sql;
第一个表(CH)具有索引(CUSTOMER_RK,RESPONSE_TRACK_CD)和日期分区。
Oracle给出以下错误:
SQL错误:ORA-01652:无法在表空间TEMP中将临时段扩展64
一种选择是扩大临时表空间(尽管可能不够),或者首先创建表并部分插入数据,特别是当你说那里有分区时。
顺便问一下,为什么要这样创建表?这很不寻常;一般来说,你应该在SQL中创建表,而不是PL / SQL。
另一种可能性是首先动态创建表 - 如果这真的是你需要的 - 使用
CREATE TABLE idb.cm_contact_add_char_exp_tmp AS
SELECT ch.*
FROM idb.cm_contact_add_char_exp ch
WHERE 1=0
然后使用批量FORALL操作从源表中插入记录。
我会问为什么你需要看起来像一个包含大约200万行的临时表。听起来有点怀疑我。