根据另一个表的总数动态创建表

时间:2019-08-14 06:20:28

标签: oracle plsql

我希望能够基于另一个表中的总行创建表。

假设我有一个表A,计数为500K,所以我想能够在oracle的过程中动态创建5个表,每100K动态创建一个表。

表A的计数每次都会改变,但是我仍然希望能够创建最大100K的表,例如,明天表A具有550K,我希望能够创建6个表,其中5个表具有100k,最后一个以50k。

SET SERVEROUTPUT ON
DECLARE
    ttl_tables NUMBER;
    var_loop NUMBER := 0;
BEGIN
    SELECT CAST(COUNT(*)/(500000) AS INT) INTO ttl_tables FROM 
    px_extract_checks;
    DBMS_OUTPUT.PUT_LINE(ttl_tables); 

    LOOP
    var_loop := var_loop + 1;
    EXECUTE IMMEDIATE (' || CREATE TABLE ' || 'table' || var_loop || ' ' || 
(Card_Number) || ');
    EXIT WHEN var_loop = ttl_tables;
    END LOOP;
END;

类似上面的事情。

2 个答案:

答案 0 :(得分:0)

我创建了一个小块来帮助您使用动态查询。

您需要根据需要在以下代码中使用实际的列名和少量更改:

有关步骤的更多信息,请参见嵌入式注释。

BEGIN
    -- BEFORE CREATING THE TABLES, NEED TO DROP THE TABLES
    FOR T IN (
        SELECT
            TABLE_NAME
        FROM
            USER_TABLES
        WHERE
            TABLE_NAME LIKE 'MY_TABLES_DYNAMIC%'
    ) LOOP
        EXECUTE IMMEDIATE 'DROP TABLE ' || T.TABLE_NAME;
    END LOOP;

    -- CREATING THE TABLES USING TABLE_A
    FOR I IN (
        SELECT
            CEIL(COUNT(1) / 100000) AS CNT -- DIVIDED THE COUNT OF ROWS BY 100K
        FROM
            TABLE_A
    ) LOOP
        -- USING CTAS
        EXECUTE IMMEDIATE 'CREATE TABLE MY_TABLES_DYNAMIC_'
                          || I.CNT
                          || ' AS '
                          || ' SELECT COL1, COL2, ... FROM'
                          || ' (SELECT A.COL1, A.COL2, ...., ROW_NUMBER() OVER (ORDER BY A.PRIMARY_KEY_OF_TABLE_A) RN '
                          || ' FROM TABLE_A A)'
                          || ' WHERE RN BETWEEN '
                          || ( ( I.CNT - 1 ) * 100000 ) + 1
                          || ' AND '
                          || ( I.CNT * 100000 );
    END LOOP;

END;

干杯!

答案 1 :(得分:0)

希望下面的代码可以帮助您满足您的要求,您可以通过更改列名,表名和计数来进行测试:

declare

tname_count number:=0;

t_name varchar2(500);

begin

select count(1) into t_count from A;

for  k in 1.. t_count 
loop

  if mod(k,100000)=0 then
    tname_count:=tname_count+1;

    t_name:='TAB_'||tname_count;

  execute immediate 'create table '|| t_name||' (id varchar2(50))';

  end if;

    end loop;

  if floor(t_count/100000)<>0 then 

    tname_count:=tname_count+1;

     t_name:='TAB_'||tname_count;

    execute immediate 'create table '|| t_name||' (id varchar2(50))';

    end if;

  end;