Sql 基于插入到表中的数据创建表

Sql 基于插入到表中的数据创建表,sql,oracle,Sql,Oracle,我有一个包含表名的表。所有这些表的结构相同,如下所示。每当此表中有一行具有表的新名称时,我都要创建一个具有该名称的表。我一直在寻找一种方法,即一旦在下一个表中插入一个具有新表名的新行,就应该通过某种触发器或其他方式自动创建一个具有该名称的新表 ID TableName 1 Electronics 2 Mechanical 3 Capacitor 表结构 CREATE TABLE Mechanical ( ID INT, ATTRIBUTE_1 VARCHAR2(25), ATTR

我有一个包含表名的表。所有这些表的结构相同,如下所示。每当此表中有一行具有表的新名称时,我都要创建一个具有该名称的表。我一直在寻找一种方法,即一旦在下一个表中插入一个具有新表名的新行,就应该通过某种触发器或其他方式自动创建一个具有该名称的新表

ID  TableName
1   Electronics
2   Mechanical
3   Capacitor
表结构

CREATE TABLE Mechanical
(
ID INT,
ATTRIBUTE_1 VARCHAR2(25),
ATTRIBUTE_2 VARCHAR2(25),
ATTRIBUTE_3 VARCHAR2(25)
)
因此,一旦我们在表中有了一个具有新表名的新行,上面的表创建命令就应该创建一个新表,并将表名插入表中。
希望这能解释需求。

编辑:正如Alex Poole所指出的,您可以通过一个自治事务来实现这一点,但不建议这样做

另一种方法可能是创建一个计划作业,该作业大约每分钟检查一次表,并为没有现有表的任何行创建新表

CREATE OR REPLACE PROCEDURE auto_create_tables
IS
BEGIN
  for t in (select tablename from my_table where tablename not in (select table_name from all_tables))
  loop
     execute immediate 'create table ' || t.tablename || ' (ID INT, ATTRIBUTE_1 VARCHAR2(25), ATTRIBUTE_2 VARCHAR2(25), ATTRIBUTE_3 VARCHAR2(25))';
  end loop;
END;
/
begin
    DBMS_SCHEDULER.CREATE_JOB (
         job_name             => 'auto_create_table_job',
         job_type             => 'STORED_PROCEDURE',
         job_action           => 'auto_create_tables',
         start_date           => sysdate,
         repeat_interval      => 'FREQ=MINUTELY;INTERVAL=1;',
         enabled              => TRUE);
end;
/

编辑:正如Alex Poole所指出的,您可以通过一个自治事务来实现这一点,但不推荐这样做

另一种方法可能是创建一个计划作业,该作业大约每分钟检查一次表,并为没有现有表的任何行创建新表

CREATE OR REPLACE PROCEDURE auto_create_tables
IS
BEGIN
  for t in (select tablename from my_table where tablename not in (select table_name from all_tables))
  loop
     execute immediate 'create table ' || t.tablename || ' (ID INT, ATTRIBUTE_1 VARCHAR2(25), ATTRIBUTE_2 VARCHAR2(25), ATTRIBUTE_3 VARCHAR2(25))';
  end loop;
END;
/
begin
    DBMS_SCHEDULER.CREATE_JOB (
         job_name             => 'auto_create_table_job',
         job_type             => 'STORED_PROCEDURE',
         job_action           => 'auto_create_tables',
         start_date           => sysdate,
         repeat_interval      => 'FREQ=MINUTELY;INTERVAL=1;',
         enabled              => TRUE);
end;
/

在这种情况下,您可以简单地创建一个表,其中一列引用第一个表中的父行,而不是多个表。这将是首选的解决方案。也就是说,Oracle还支持嵌套表。嵌套表可能是第二个最好的解决方案。我会考虑只使用一个、单个属性列(如果需要的话插入几行)。对于一个玩具应用程序,您将很满意任何方法,但一般来说,键值和COL1、COL2、COL3NUM、COL4YDY、…这种方法的规模非常大。不管怎样,如果你有一个与你所有子类型相同的结构,你可以考虑列表分区。@ JARLH,这是最佳的方法,如果不需要访问数据……这是一个非常可怕的要求…这就好像有人想通过为每个excel文件创建一个表,在数据库中重新创建一个包含excel文件的windows目录。这将起作用,但关系数据库的功能完全没有发挥出来。。。有其他相同表格的原因是什么?(我想不出任何好的…)在这种情况下,您可以不创建多个表,只创建一个表,其中一列引用第一个表中的父行。这将是首选的解决方案。也就是说,Oracle还支持嵌套表。嵌套表可能是第二个最好的解决方案。我会考虑只使用一个、单个属性列(如果需要的话插入几行)。对于一个玩具应用程序,您将很满意任何方法,但一般来说,键值和COL1、COL2、COL3NUM、COL4YDY、…这种方法的规模非常大。不管怎样,如果你有一个与你所有子类型相同的结构,你可以考虑列表分区。@ JARLH,这是最佳的方法,如果不需要访问数据……这是一个非常可怕的要求…这就好像有人想通过为每个excel文件创建一个表,在数据库中重新创建一个包含excel文件的windows目录。这将起作用,但关系数据库的功能完全没有发挥出来。。。有其他相同表格的原因是什么?(我想不出有什么好的…)但这是DDL,它提交,而你不能在触发器中提交?除非您使其自治,否则我想,插入可以回滚并保留新表。谢谢,我总是忘记那件事。编辑了我的答案。但这是DDL,它提交,你不能在触发器中提交吗?除非您使其自治,否则我想,插入可以回滚并保留新表。谢谢,我总是忘记那件事。编辑了我的答案。