powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Копирование таблицы со всеми свойствами
5 сообщений из 5, страница 1 из 1
Копирование таблицы со всеми свойствами
    #40058220
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

У меня есть две таблицы.
А1, А2.

В таблице А1 есть первичный ключ PK_A1 и внешний ключ FK_A1.

Копирую из А1 в А2 содержимое в процедуре:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE PROCEDURE COPY_TABLE(FROM_NAME VARCHAR, TO_NAME VARCHAR)
    AS       
    
    dynamicsql VARCHAR2(500);
    
    BEGIN
        
        dynamicsql := 'INSERT INTO ' || TO_NAME || ' SELECT * FROM ' || FROM_NAME;
                     
        EXECUTE IMMEDIATE dynamicsql;

    END COPY_TABLE;



Но возникла проблема с копированием CONSTRAINT из А1 в А2.

Можно вытащить CONSTRAINT из А1:

Код: plsql
1.
2.
select DBMS_METADATA.GET_DDL('CONSTRAINT','PK_A1','HR') from dual;
select DBMS_METADATA.GET_DDL('CONSTRAINT','FK_A1','HR') from dual;



Теперь как этот CONSTRAINT залить в A2 в хранимой процедуре?
...
Рейтинг: 0 / 0
Копирование таблицы со всеми свойствами
    #40058268
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuidТеперь как этот CONSTRAINT залить в A2 в хранимой процедуре?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
SQL> create table a1(
  2    id int,
  3    a1_id int,
  4    c_nn int not null,
  5    c_nn2 int constraint c_nn2 not null,
  6    c_ck_inline int check(c_ck_inline>0),
  7    c_ck int,
  8    c_uk int unique,
  9    constraint pk_a1 primary key(id),
 10    constraint a1_a1_fk foreign key(a1_id) references a1,
 11    constraint c_ck check(c_ck>0)
 12  );

Table created.

SQL>
SQL> var handle number
SQL> exec :handle:=dbms_metadata.open('CONSTRAINT')

PL/SQL procedure successfully completed.

SQL> exec dbms_metadata.set_filter(:handle, 'BASE_OBJECT_NAME', 'A1')

PL/SQL procedure successfully completed.

SQL> exec dbms_metadata.set_filter(:handle, 'CUSTOM_FILTER', 'KU$.CON1.CONTYPE=2')

PL/SQL procedure successfully completed.

SQL>
SQL> var tx_handle number
SQL> exec :tx_handle := dbms_metadata.add_transform(:handle, 'MODIFY')

PL/SQL procedure successfully completed.

SQL> exec dbms_metadata.set_remap_param(:tx_handle, 'REMAP_NAME', 'A1', 'A2')

PL/SQL procedure successfully completed.

SQL> exec dbms_metadata.set_remap_param(:tx_handle, 'REMAP_NAME', 'PK_A1', 'PK_A2')

PL/SQL procedure successfully completed.

SQL> exec :tx_handle:=dbms_metadata.add_transform(:handle, 'DDL')

PL/SQL procedure successfully completed.

SQL>
SQL> exec dbms_metadata.set_count(:handle, 10)

PL/SQL procedure successfully completed.

SQL>
SQL> set pages 100
SQL> col ddltext for a80
SQL>
SQL> select ddltext from dbms_metadata.fetch_ddl(:handle);

DDLTEXT
--------------------------------------------------------------------------------
ALTER TABLE "TC"."A2" ADD CONSTRAINT "PK_A2" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255
  TABLESPACE "USERS"  ENABLE
...
Рейтинг: 0 / 0
Копирование таблицы со всеми свойствами
    #40058270
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкинуть и переписать используя DBMS_DATAPUMP. A так через DBMS_METADATA API:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
set serveroutput on
declare
    v_filter_handle    integer;
    v_remap_handle     integer;
    v_transform_handle integer;
begin
    v_filter_handle := dbms_metadata.open('CONSTRAINT');
    dbms_metadata.set_filter(v_filter_handle,'SCHEMA','SCOTT');
    dbms_metadata.set_filter(v_filter_handle,'NAME','PK_EMP');
    v_remap_handle := dbms_metadata.add_transform(v_filter_handle,'MODIFY');
    dbms_metadata.set_remap_param(v_remap_handle,'REMAP_NAME','PK_EMP','PK_NEW_EMP');
    dbms_metadata.set_remap_param(v_remap_handle,'REMAP_SCHEMA','SCOTT','NEW_SCOTT');
    dbms_metadata.set_remap_param(v_remap_handle,'REMAP_TABLESPACE','USERS','NEW_TBS');
    v_transform_handle := dbms_metadata.add_transform(v_filter_handle,'DDL');
    dbms_metadata.set_transform_param(v_transform_handle,'SQLTERMINATOR',false);
    dbms_output.put_line(dbms_metadata.fetch_clob(v_filter_handle));
    dbms_metadata.close(v_filter_handle);
end;
/

  ALTER TABLE "NEW_SCOTT"."EMP" ADD CONSTRAINT "PK_NEW_EMP" PRIMARY KEY
("EMPNO")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645

PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE
DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "NEW_TBS"  ENABLE

PL/SQL procedure successfully completed.

SQL>



SY.
...
Рейтинг: 0 / 0
Копирование таблицы со всеми свойствами
    #40058277
LiQuid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY,

Ок, выкину.
Но вот задача не дает покоя:

Задача.
Процедура копирования таблицы COPY_TABLE(FROM_NAME, TO_NAME). Данные и все Constraints, также должны копироваться. Входящие аргументы:
- FROM_NAME - имя таблицы, которую надо скопировать;
- TO_NAME - имя новой таблицы.

Вообще то что вы пишете реально реализовать в рамках одной хранимой процедуры?
...
Рейтинг: 0 / 0
Копирование таблицы со всеми свойствами
    #40058284
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LiQuid

Вообще то что вы пишете реально реализовать в рамках одной хранимой процедуры?


Можно, но для чего это нужно?

SY.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Копирование таблицы со всеми свойствами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]