如何填充Oracle分区表

时间:2013-06-25 08:01:40

标签: oracle loops plsql populate

我有这张桌子:

CREATE TABLE TBIGP
(
IDPER NUMBER(6),
DESCRIZIONE VARCHAR2(50),
DINS DATE
)
PARTITION BY LIST (IDPER)
(
PARTITION P201201 VALUES(201201),
PARTITION P201202 VALUES(201202),
PARTITION P201203 VALUES(201203),
PARTITION P201204 VALUES(201204),
PARTITION P201205 VALUES(201205),
PARTITION P201206 VALUES(201206),
PARTITION P201207 VALUES(201207),
PARTITION P201208 VALUES(201208),
PARTITION P201209 VALUES(201209),
PARTITION P201210 VALUES(201210),
PARTITION P201211 VALUES(201211),
PARTITION P201212 VALUES(201212),
PARTITION P201301 VALUES(201301),
PARTITION P201302 VALUES(201302),
PARTITION P201303 VALUES(201303),
PARTITION P201304 VALUES(201304),
PARTITION P201305 VALUES(201305),
PARTITION P201306 VALUES(201306),
PARTITION P201307 VALUES(201307),
PARTITION P201308 VALUES(201308),
PARTITION P201309 VALUES(201309),
PARTITION P201310 VALUES(201310),
PARTITION P201311 VALUES(201311),
PARTITION P201312 VALUES(201312),
PARTITION OTHER VALUES(DEFAULT)
);

现在我想以这种方式填充表格。使用一些迭代过程,如 for while loop ,我希望每个分区都由500000条记录组成。为了精确,每个分区都有1到450000-500000条记录,其中记录数是随机的(一个分区可以有480000条记录,另一个分区有490000或450000或467890条记录....)。

每生成1000条记录,我想做一个提交

我不知道是否清楚。我很难用英语解释。谢谢。

修改

这样的事情:

BEGIN
FOR i IN 1..24
LOOP
j:=1
z:=dbms_random.value(450000,500000)
WHILE j<=z
INSERT INTO T_BIG_P_1
VALUES (i, 'description', TRUNC(SYSDATE + DBMS_RANDOM.value(0,366))
IF MOD (j, 1000) = 0 THEN
COMMIT;
END IF;
j:=j+1;
END LOOP;
END;

exec DBMS_STATS.GATHER_TABLE_STATS('SH','T_BIG_P_1');

2 个答案:

答案 0 :(得分:2)

一个简单的匿名PL / SQL块应该符合您的需求:

DECLARE
  n INTEGER;
  idper INTEGER;
  s VARCHAR2(50);  
begin
  FOR year IN 2012..2013 LOOP
    FOR MONTH IN 1..12 LOOP
      idper := MONTH+(YEAR*100); 
      n := Dbms_Random.Value( low=>450000, high => 500000 );
      FOR i IN 1..n LOOP
        s := Dbms_Random.string('x',25)||' '||idper;
        INSERT INTO TBIGP (idper,DESCRIZIONE,DINS) VALUES (idper,s,SYSDATE); 
        IF Mod(i,1000) = 0 THEN
            COMMIT;
        END IF;
      END LOOP;
      COMMIT;
    END LOOP;
  END LOOP;
END;
/

请注意,可以使用FORALL语句进一步优化此代码,以便从批量插入中受益。

答案 1 :(得分:1)

要将过程中的数据插入到表中,可以使用类似

的代码
CREATE OR REPLACE PROCEDURE my_filler  AS
BEGIN
  FOR i IN 1 .. 500000 LOOP

    -- compute your idper, descrizione, dins and then insert into the table
    INSERT INTO tbigp (idper, descrizione, dins) VALUES (x, y, z);

    IF MOD(i, 10)=0 THEN
      dbms_application_info.set_module('my_filler', 'i='||i);
      COMMIT;
    END IF;
  END LOOP;
END my_filler;
/

话虽如此,这将非常非常慢。

我不建议
  1. 填写程序
  2. 1000行后提交