を使用して、別のテーブルに格納されたテーブルを作成します...</p> <p>を私はその情報TABLE_NAMEなど、COLUMN_NAME、DATA_TYPE画像次のように別のテーブルに格納されているテーブルを作成するストアドプロシージャ(複数可)を記述する必要があり、その情報ストアドプロシージャ
プライマリn外部キーの仕様を心配する必要はありません。 これはORACLEで可能ですか?
ありがとうございました。
を使用して、別のテーブルに格納されたテーブルを作成します...</p> <p>を私はその情報TABLE_NAMEなど、COLUMN_NAME、DATA_TYPE画像次のように別のテーブルに格納されているテーブルを作成するストアドプロシージャ(複数可)を記述する必要があり、その情報ストアドプロシージャ
プライマリn外部キーの仕様を心配する必要はありません。 これはORACLEで可能ですか?
ありがとうございました。
はい。 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
、デフォルトなどの規定はありません。
私はこのシステムでこの問題に取り組む必要があります。それはなんのためですか?
私はそこより良いアプローチになりますが、一方であなたは以下に取り組むことができると確信してい:
あなたの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)
* from user_tab_columns' –