2016-07-19 1 views
-1

を使用して、別のテーブルに格納されたテーブルを作成しますtable details...</p> <p>を私はその情報TABLE_NAMEなど、COLUMN_NAME、DATA_TYPE画像次のように別のテーブルに格納されているテーブルを作成するストアドプロシージャ(複数可)を記述する必要があり、その情報ストアドプロシージャ

プライマリn外部キーの仕様を心配する必要はありません。 これはORACLEで可能ですか?

ありがとうございました。

+0

* from user_tab_columns' –

答えて

0

はい。 DDL文字列をループ内に構築し、execute immediateで実行します。例えば

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; 

デモのセットアップ:

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; 

しかし、この全体のアプローチにはいくつかの問題があります。

私はあなたのVARCHAR2列に長さを加えなければなりませんでした。数値の列ごとに平文をNUMBERにしたくない場合は、他のものに対しても同じ処理を行う必要があります。また、列の順序がないため、任意の順序で生成できます。 id列の目的がわかりませんでした - それはユニークであることを意味しましたか、またはtable_name内で一意であることを意味しましたか? NOT NULL、デフォルトなどの規定はありません。

私はこのシステムでこの問題に取り組む必要があります。それはなんのためですか?

0

私はそこより良いアプローチになりますが、一方であなたは以下に取り組むことができると確信してい:

あなたのprocコードは次のようなものでなければなりません: `選択:あなたは既にことを持っている

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) 
関連する問題