2016-07-19 9 views
-1

Ich brauche eine gespeicherte Prozedur schreiben Tabelle zu erstellen (s), deren Informationen wie table_name, column_name, data_type in einer anderen Tabelle, wie unten Bild gespeichert werden ...Erstellen von Tabellen, der Informationen in einer anderen Tabelle gespeichert unter Verwendung der gespeicherten Prozedur

table details

Sie müssen sich keine Gedanken über die primären Fremdschlüssel-Spezifikationen machen. Ist das in ORACLE möglich?

Vielen Dank im Voraus.

+0

Sie haben bereits das: 'wählen * von user_tab_columns' –

Antwort

0

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?

0

Ich bin sicher, es wird ein besserer Ansatz sein, aber in der Zwischenzeit können Sie auf der unten arbeiten:

Ihr proc Code in etwa so sein sollte:

select distinct id, table_name 
bulk collect into ip_id, ip_tab_name 
from tab_details; 

for x in ip_id.first .. ip_id.last loop 

select column_name, data_type bulk collect into v_col_name, 
v_data_type from tab_Details where id= ip_id(x); 

v_sql := 'create table ' || ip_tab_name(x) || ' (col1 number) '; 

execute immediate v_sql; 

for i in v_col_name.first .. v_col_name.last loop 

v_sql1 := 'alter table ' || ip_tab_name(x) || ' add ' || v_col_name(i) 
|| ' ' || v_data_type(i); 

execute immediate v_sql1; 

end loop; -- (for i loop) 

v_sql2 := 'alter table ' || ip_tab_name(x) || ' drop column col1 '; 

execute immediate v_sql2; 

end loop;-- (for x loop)