0

我有这张桌子:

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)
);

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

每生成 1000 条记录,我想做一次commit

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

编辑

像这样的东西:

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');
4

2 回答 2

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 语句进一步优化此代码以从批量插入中受益。

于 2013-06-25T08:56:21.377 回答
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 行之后提交
于 2013-06-25T08:41:56.683 回答