我有一个包含表名的表。所有这些表的结构相同,如下所示。每当此表中有一个具有新名称表的附加行时,我将创建一个具有该名称的表。我一直在寻找某种方法,只要将具有新表名的新行插入到下表中,就应该通过某种触发器或其他方式自动创建具有该名称的新表。
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)
)
因此,只要我们在表中有一个具有新表名的新行,上面的表创建命令应该创建一个新表,表名插入到表中。 希望这能解释要求。
答案 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;
/