动态创建表和生成数据

--XMLTABLE中的to变量只能是小写
CREATE OR REPLACE PROCEDURE PKG_AUTOCREATETABLEANDDATA(
PN_COL_NUM NUMBER DEFAULT 0,
PN_ROW_NUM NUMBER DEFAULT 0,
PC_TABLE_NAME OUT VARCHAR2)
AS
LN_COL_NUM NUMBER;
LN_ROW_NUM NUMBER;
LC_TABLE_NAME VARCHAR2(30);
LC_COLUMN_TYPE_LIST VARCHAR2(30000):='|VARCHAR2(LNG)<DBMS_RANDOM.STRING(''U'',LNG)>|NUMBER<DBMS_RANDOM.VALUE(-99999999999999,+99999999999999)>|DATE<SYSDATE-DBMS_RANDOM.VALUE(-100000,100000)>|';
LC_TABLE_CREATE VARCHAR2(30000);
LC_TABLE_INSERT VARCHAR2(30000);
LC_TMP_COLTYPE VARCHAR2(30000);
LC_TMP_DATA VARCHAR2(30000);
LN_TMP_LENGTH NUMBER;
LN_TMP_NB NUMBER;
BEGIN
FOR K IN 1..100 LOOP
LC_TABLE_CREATE:='';
LC_TABLE_INSERT:='';
IF PN_COL_NUM BETWEEN 1 AND 5 THEN
LN_COL_NUM:=PN_COL_NUM;
ELSE
LN_COL_NUM:=ROUND(DBMS_RANDOM.VALUE(1,5));
END IF;
IF PN_ROW_NUM BETWEEN 1 AND 5 THEN
LN_ROW_NUM:=PN_ROW_NUM;
ELSE
LN_ROW_NUM:=ROUND(DBMS_RANDOM.VALUE(1,1000));
END IF;
LC_TABLE_NAME:='TETB_'||TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS')||DBMS_RANDOM.STRING('U',11);
FOR I IN 1..LN_COL_NUM LOOP
--GET COLUMN TYPE
LN_TMP_NB:=LENGTH(REPLACE(LC_COLUMN_TYPE_LIST,'|','||'))-LENGTH(LC_COLUMN_TYPE_LIST)-1;
LN_TMP_NB:=ROUND(DBMS_RANDOM.VALUE(1,LN_TMP_NB));
LC_TMP_COLTYPE:=SUBSTR(LC_COLUMN_TYPE_LIST,INSTR(LC_COLUMN_TYPE_LIST,'|',1,LN_TMP_NB)+1);
LC_TMP_DATA:=SUBSTR(LC_TMP_COLTYPE,INSTR(LC_TMP_COLTYPE,'<')+1);
LC_TMP_DATA:=SUBSTR(LC_TMP_DATA,1,INSTR(LC_TMP_DATA,'>')-1);
LC_TMP_COLTYPE:=SUBSTR(LC_TMP_COLTYPE,1,INSTR(LC_TMP_COLTYPE,'<')-1);
--VARCHAR2 LENGTH
IF INSTR(LC_TMP_DATA,'LNG')>0 OR INSTR(LC_TMP_COLTYPE,'LNG')>0 THEN
LN_TMP_LENGTH:=ROUND(DBMS_RANDOM.VALUE(1,1500));
LC_TMP_DATA:=REPLACE(LC_TMP_DATA,'LNG',LN_TMP_LENGTH);
LC_TMP_COLTYPE:=REPLACE(LC_TMP_COLTYPE,'LNG',LN_TMP_LENGTH);
END IF;
LC_TABLE_CREATE:=LC_TABLE_CREATE||', COL'||I||' '||LC_TMP_COLTYPE;
LC_TABLE_INSERT:=LC_TABLE_INSERT||', '||LC_TMP_DATA;
END LOOP;
--LC_TABLE_CREATE:='CREATE TABLE '||LC_TABLE_NAME||' ('||SUBSTR(LC_TABLE_CREATE,2)||')';
LC_TABLE_CREATE:='CREATE TABLE '||LC_TABLE_NAME||' (ID NUMBER PRIMARY KEY,'||SUBSTR(LC_TABLE_CREATE,2)||')';
LC_TABLE_INSERT:='INSERT INTO '||LC_TABLE_NAME||' SELECT ROWNUM,'||SUBSTR(LC_TABLE_INSERT,2)||' FROM XMLTABLE(''1 to '||LN_ROW_NUM||''')';
PC_TABLE_NAME:=LC_TABLE_NAME||' COL:'||LN_COL_NUM||' ROW:'||LN_ROW_NUM;
EXECUTE IMMEDIATE LC_TABLE_CREATE;
EXECUTE IMMEDIATE LC_TABLE_INSERT;
COMMIT;
END LOOP;
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(LC_TABLE_CREATE);
DBMS_OUTPUT.PUT_LINE(LC_TABLE_INSERT);
RAISE_APPLICATION_ERROR(-20010,SQLCODE||'--'||SQLERRM);
END PKG_AUTOCREATETABLEANDDATA;
/

--------------------------------------------------------------------------------------------------------------------------------------------
--查询生成的表和数据
SELECT 'SELECT * FROM '||T.TABLE_NAME||';','DROP TABLE '||T.TABLE_NAME||';',T.* FROM USER_TABLES T WHERE T.TABLE_NAME LIKE '%TETB%';

--生成表和数据
DECLARE
v_table_name VARCHAR2(500);
BEGIN
PKG_autocreatetableanddata(2,2,pc_table_name =>v_table_name);
END;
/

--删除表
DECLARE
V_EXE VARCHAR2(1000);
BEGIN
FOR REC IN (SELECT 'DROP TABLE '||T.TABLE_NAME AS V_EXE FROM USER_TABLES T WHERE T.TABLE_NAME LIKE '%TETB%') LOOP
EXECUTE IMMEDIATE REC.V_EXE;
END LOOP;
END;
/

猜你喜欢

转载自www.cnblogs.com/buffercache/p/10176774.html