【问题标题】:Is that possible the copy all table on same schema in plsql是否可以在 plsql 中复制同一模式上的所有表
【发布时间】: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;

【问题讨论】:

标签: plsql oracle11g plsqldeveloper


【解决方案1】:

可以使用以下查询创建索引。您可以使用查询并编写用于创建表的过程。

    SELECT uc.constraint_name,
           uc.table_name,
           listagg(uc.column_name, ',') within GROUP(ORDER BY uc.column_name)
      FROM user_cons_columns uc
     GROUP BY uc.constraint_name;

但这仅限于创建普通或唯一索引,而不是主键或外键约束及其默认索引。 为此,您必须获取 DDL 并创建可以一次性执行的脚本。

【讨论】:

  • 谢谢我解决了我的问题你可以在下面看到我的代码
猜你喜欢
  • 2021-03-16
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多