如何填充Oracle分区表

如何填充Oracle分区表,oracle,loops,plsql,populate,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), PA

我有这张桌子:

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');
开始
因为我在1..24
环
j:=1
z:=dbms_随机值(450000500000)

当j将过程中的数据插入到表中时,可以使用如下代码

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;
/
话虽如此,这将是非常非常缓慢的。我不会给你建议的

  • 用程序填充它
  • 在1000行之后提交

  • 要将过程中的数据插入表中,可以使用如下代码

    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;
    /
    
    话虽如此,这将是非常非常缓慢的。我不会给你建议的

  • 用程序填充它
  • 在1000行之后提交

  • 一个简单的匿名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语句可以进一步优化此代码,从而受益于批量插入。

    一个简单的匿名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语句可以进一步优化此代码,从而受益于批量插入。

    “填充”-您的数据来自哪里?另一个表、一个文件、一个过程?Oracle版本11。我必须用一个过程手动填充表格。在创建之后,我想执行一个带有循环的plsql过程来填充表。这似乎是分区机制的一个非常不寻常的用法-您确定在一个名为IDPER的列中使用值为201312的480000行吗?@GregHNZ yes仅用于EXERSISE。“填充”-您的数据来自哪里?另一个表、一个文件、一个过程?Oracle版本11。我必须用一个过程手动填充表格。在创建之后,我想用一个循环执行一个plsql过程来填充表。这似乎是分区机制的一个非常不寻常的用法-你确定你想在一个名为IDPER的列中使用值为201312的480000行吗?@GregHNZ yes仅用于练习。请参阅我的编辑。。。。是这样的!在IDPER列中,有一个按月份划分的2012/13年的日期。。。比如201201、201202、201203等等。我想在列中插入2年。分区名称重要吗?或者可以使用间隔分区吗?请参阅我的编辑。。。。是这样的!在IDPER列中,有一个按月份划分的2012/13年的日期。。。比如201201、201202、201203等等。我想在列中插入2年。分区名称重要吗?或者可以使用间隔分区吗?