【发布时间】:2015-03-26 04:47:04
【问题描述】:
是否可以在所有对象的同一架构上编写包含 (data ,pk , fk .....) 脚本的所有表的副本?
当我运行下面的代码时create table testmember as (select * from member);
我只能带表格数据。当我执行此代码时,我没有看到表键(FK,PK)请有人告诉我一个方法
更新---- 嗨,我创建了所有带有数据的表,您可以对其进行测试,但要小心:) 在我的问题中,我怎样才能在这个表中添加 pk ?
declare
Procedure test_copy_table is
sqlString VARCHAR2(2000) := '';
Cursor tables is
select * from user_tables;
begin
for rec in tables
loop
dbms_output.put_line(rec.table_name);
sqlString:='CREATE TABLE T_' ||rec.table_name || ' AS (SELECT * FROM ' ||rec.table_name|| ')';
dbms_output.put_line(sqlString);
execute immediate sqlString;
end loop;
end;
begin
test_copy_table();
end;`
在此代码部分中,使用我之前所说的数据创建所有表,请添加一些更清晰的信息。更新---
您可以获取所有初级密钥,您可以在下面的代码 thx 中看到 helpinn。此脚本可帮助您解决问题。
procedure copy_pk_same_schema is
put_semicolumn varchar2(1);
begin
for uc in (select *
from user_constraints
where constraint_name not like 'BIN$%'
and constraint_name not like 'SYS_%'
and constraint_type = 'P') loop
-- dbms_output.put_line('--table/pk: ' || uc.table_name || ' ' ||
-- uc.constraint_name);
-- dbms_output.put_line('alter table T_' || uc.table_name || ' drop constraint ' || uc.constraint_name||';');
if LENGTH('T_' || uc.table_name) > 30 then
dbms_output.put_line('alter table T_' ||
substr(uc.table_name,
1,
(length(uc.table_name) - 5)) ||
' add constraint');
else
dbms_output.put_line('alter table T_' || uc.table_name ||
' add constraint');
end if;
if LENGTH('T_' || uc.constraint_name) > 30 then
dbms_output.put_line('T_' ||
substr(uc.constraint_name,
1,
(length(uc.constraint_name) - 5)) ||
' primary key (');
else
dbms_output.put_line('T_' || uc.constraint_name ||
' primary key (');
end if;
put_semicolumn := 'F';
for pk in (select *
from user_cons_columns
where constraint_name not like 'BIN$%'
and table_name = uc.table_name
and constraint_name = uc.constraint_name
order by constraint_name, position) loop
if put_semicolumn = 'F' then
dbms_output.put_line(pk.column_name);
put_semicolumn := 'T';
else
dbms_output.put_line(',' || pk.column_name);
end if;
end loop;
dbms_output.put_line(');');
end loop;
end;
【问题讨论】:
-
不像选择语法那样作为创建表的功能。您首先必须基于 DDL 创建表,然后将数据插入,而不是使用
create table X as (Select)语法。考虑:stackoverflow.com/questions/233870/… 或 dba.stackexchange.com/questions/18058/…
标签: plsql oracle11g plsqldeveloper