Sql 动态创建一个表,然后动态插入数据

Sql 动态创建一个表,然后动态插入数据,sql,oracle,Sql,Oracle,我想创建一个过程,用用户输入的从1到n的列数动态创建一个表。我使用下面的脚本动态创建表- CREATE OR REPLACE PROCEDURE TABLES(COLS IN NUMBER) AS TABLE_STMT VARCHAR2(100); TABLE_COLS VARCHAR2(100); BEGIN TABLE_STMT := 'CREATE TABLE TABLS(COL'; FOR I IN 1..COLS LOOP IF I = COLS

我想创建一个过程,用用户输入的从1到n的列数动态创建一个表。我使用下面的脚本动态创建表-

CREATE OR REPLACE PROCEDURE TABLES(COLS IN NUMBER)
AS
TABLE_STMT VARCHAR2(100);
TABLE_COLS VARCHAR2(100);
BEGIN
     TABLE_STMT := 'CREATE TABLE TABLS(COL';
     FOR I IN 1..COLS LOOP
         IF I = COLS THEN
             TABLE_STMT := TABLE_STMT || I || ' VARCHAR2(50)) ';
         ELSE
             TABLE_STMT := TABLE_STMT || I || ' VARCHAR2(50), COL';
         END IF;
     END LOOP;
     EXECUTE IMMEDIATE TABLE_STMT;
     DBMS_OUTPUT.PUT_LINE(TABLE_STMT);
END;
/
我还有另一张桌子-

VAL
A
B
C
D
E
F
G
H
其行需要在上表中创建的列中拆分。如果用户输入2列,则输出应为-

col1  |  col2
A     |  B
C     |  D
E     |  F
G     |  H
如果用户输入3列,则输出应为-

col1  |  col2  |  col3
A     |  B     |  C
D     |  E     |  F
G     |  H

我已经成功地创建了表,但却在其中插入了数据。非常感谢您的帮助。

使用动态轴将行转换为列:

创建过程插入数据 VARCHAR2中的i_表_名称 是 p_sql CLOB; 开始 选择“插入到”| | i|表|名称|” 选择“| |列表标记”| | |列| |”、” 按列| id | |排列的组内顺序 从…起 选择val, MOD ROWNUM-1,“| |计数*| |”+1作为列, 地板行数-1/“| |计数*| |”+1作为rn 从数据 列的轴最大值' ||LISTAGG Column|u ID | | AS'| | | Column| u name |',' 组内订单(按列\u id) || 转换为p_sql 从用户选项卡列 其中table_name=i_table_name; 执行即时p_-sql; DBMS_OUTPUT.PUT_LINE p_sql; 终止 / 然后

声明 cols整数:=3; 开始 表cols; 插入_数据“表格”; 终止 / 产出:

产出:


dbfiddle

如果您不喜欢使用pivot的解决方案,可以使用分析函数lead生成代码:

with la as (select chr(level+64)c from dual connect by level <= 8)
, pv as (select c
               ,lead(c) over (partition by 1 order by rownum) c2
               ,lead(c,2)over (partition by 1 order by rownum) c3
               , mod(rownum,3)r 
            from la)
select c,c2,c3  from pv 
where r = 1
COL1 | COL2 | COL3 :--- | :--- | :--- A | B | C D | E | F G | H | null
with la as (select chr(level+64)c from dual connect by level <= 8)
, pv as (select c
               ,lead(c) over (partition by 1 order by rownum) c2
               ,lead(c,2)over (partition by 1 order by rownum) c3
               , mod(rownum,3)r 
            from la)
select c,c2,c3  from pv 
where r = 1