Sql 使用存储过程创建其信息存储在另一个表中的表
我需要编写一个存储过程来创建表,其信息(如表名称、列名称、数据类型)存储在另一个表中,如下图所示 不需要担心Primary n外键规范。 在ORACLE中有可能做到这一点吗Sql 使用存储过程创建其信息存储在另一个表中的表,sql,oracle,plsql,Sql,Oracle,Plsql,我需要编写一个存储过程来创建表,其信息(如表名称、列名称、数据类型)存储在另一个表中,如下图所示 不需要担心Primary n外键规范。 在ORACLE中有可能做到这一点吗 提前谢谢。是的。在循环中构造DDL字符串,并使用executeimmediate执行它 例如: begin for r in ( select 'create table ' || td.table_name || chr(10)||'( ' || listagg(rp
提前谢谢。是的。在循环中构造DDL字符串,并使用
executeimmediate
执行它
例如:
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
列的用途-它是要唯一的,还是在表\u name
中唯一的?并且没有关于不为空
、默认值等的规定
如果我在一个必须处理的系统中遇到这个问题,我会相当紧张。这是干什么用的?我相信会有更好的方法,但同时你可以做以下工作: 您的程序代码应该如下所示:
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)
您已经有了:
select*from user\u tab\u columns