根据插入表中的数据创建表

时间:2021-03-18 14:54:29

标签: sql oracle

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

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)
)

因此,只要我们在表中有一个具有新表名的新行,上面的表创建命令应该创建一个新表,表名插入到表中。 希望这能解释要求。

1 个答案:

答案 0 :(得分:2)

编辑:正如 Alex Poole 所指出的,您可以通过自治事务来执行此操作,但不建议这样做,因为 it will leave orphan tables with rollbacks

CREATE OR REPLACE PROCEDURE create_table(table_name in varchar2)
IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  execute immediate 'create table ' || table_name || ' (ID INT, ATTRIBUTE_1 VARCHAR2(25), ATTRIBUTE_2 VARCHAR2(25), ATTRIBUTE_3 VARCHAR2(25))';
END;
/
CREATE OR REPLACE TRIGGER create_table_trigger
AFTER INSERT ON my_table FOR EACH ROW 
BEGIN
    create_table(:new.tablename);
END;
/

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

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;
/