我希望能够基于另一个表中的总行创建表。
假设我有一个表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;
类似上面的事情。
答案 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;