Ja. Konstruieren Sie die DDL-Zeichenfolge in einer Schleife, und führen Sie sie mit aus.
Zum Beispiel:
begin
for r in (
select 'create table ' || td.table_name || chr(10)||'(' ||
listagg(rpad(td.column_name,31) || td.data_type, chr(10)||', ') within group (order by id) ||
')' as create_table
from table_definitions td
group by td.id, td.table_name
order by td.id
)
loop
dbms_output.put_line(r.create_table || ';' || chr(10));
execute immediate r.create_table;
end loop;
end;
Demo-Setup:
create table table_definitions
(id integer not null
, table_name varchar2(30) not null
, column_name varchar2(30) not null, data_type varchar2(30) not null
, constraint tabdef_uk unique (table_name, column_name));
insert all
into table_definitions values (1, 'EMP', 'EMP_ID', 'NUMBER')
into table_definitions values (1, 'EMP', 'EMP_NAME', 'VARCHAR2(30)')
into table_definitions values (1, 'EMP', 'SALARY', 'NUMBER')
into table_definitions values (1, 'EMP', 'DEPT_ID', 'NUMBER')
into table_definitions values (2, 'DEPT', 'DEPT_ID', 'NUMBER')
into table_definitions values (2, 'DEPT', 'DEPT_NAME', 'VARCHAR2(30)')
into table_definitions values (2, 'DEPT', 'LOCATION', 'VARCHAR2(30)')
select * from dual;
jedoch, gibt es einige Probleme mit diesem ganzen Ansatz.
Ich musste Längen zu Ihren VARCHAR2
Spalten hinzufügen. Sie müssen das gleiche für die anderen tun, wenn Sie keine einfache NUMBER
für jede numerische Spalte wollten. Außerdem gibt es keine Spaltenreihenfolge, sodass sie in beliebiger Reihenfolge generiert werden können. Ich konnte den Zweck der id
Spalte nicht sehen - sollte es einzigartig oder einzigartig innerhalb table_name
sein? Und es gibt keine Vorkehrung für NOT NULL
, Standardeinstellungen usw.
Ich wäre ziemlich nervös, wenn ich in einem System auf dieses System stoßen würde. Wofür ist das?
Sie haben bereits das: 'wählen * von user_tab_columns' –