replace
을 사용하는 벤의 제안은 꽤 합리적이지만, 어떤 이유로 든 그렇게하고 싶지 않으면 프로그래밍 방식으로 할 수 있습니다. 단지 더 많은 작업과 코드 일뿐입니다.
dbms_metadata
패키지를 사용하여 DDL을 추출하면 set_remap_param 절차를 사용하여 DDL이 표시되는 방식을 수정할 수 있습니다. 그러나 기본 세션 핸들과 함께 작동하지 않는 것으로 보이는 ad hoc 쿼리에 사용하기가 쉽지 않습니다 (set_transform_param
). 옵션 중 하나는 REMAP_SCHEMA
이므로 데이터 펌프와 마찬가지로 DDL을 추출 할 때 스키마를 변경할 수 있습니다.
내가 더미 테이블을 작성하는 경우, 세션 수준에서 몇 가지 간단한 변환을 설정 한 다음 get_ddl
전화를 내가 얻을 : 분명히 내 스키마, STACKOVERFLOW
을 가지고
create table t42(id number);
begin
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'PRETTY', value => FALSE);
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'SEGMENT_ATTRIBUTES', value => FALSE);
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'STORAGE', value => FALSE);
dbms_metadata.set_transform_param(
transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
name => 'SQLTERMINATOR', value => TRUE);
end;
/
select dbms_metadata.get_ddl('TABLE', 'T42') from dual;
DBMS_METADATA.GET_DDL('TABLE','T42')
--------------------------------------------------------------------------------
CREATE TABLE "STACKOVERFLOW"."T42" ("ID" NUMBER) ;
. PL/SQL 블록으로 내가 주문이를 다시 매핑 할 수 있습니다, 그리고 텍스트 검색하고 표시 할 수는 SQL * Plus를 VARIABLE
을 사용하고 있습니다 : 그래서
variable c clob
declare
l_handle number;
l_transform_handle number;
begin
l_handle := dbms_metadata.open(object_type => 'TABLE');
-- identify the object you want
dbms_metadata.set_filter(l_handle, 'SCHEMA', USER);
dbms_metadata.set_filter(l_handle, 'NAME', 'T42');
-- set up a MODIFY transform and apply REMAP_SCHEMA to it
l_transform_handle := dbms_metadata.add_transform(handle => l_handle,
name => 'MODIFY');
dbms_metadata.set_remap_param(transform_handle => l_transform_handle,
name => 'REMAP_SCHEMA', old_value => USER, new_value => 'ORDER');
-- switch back from XML to DDL
l_transform_handle := dbms_metadata.add_transform(l_handle, 'DDL');
-- set other 'pretty' transforms, to taste
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'PRETTY', value => FALSE);
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'SEGMENT_ATTRIBUTES', value => FALSE);
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'STORAGE', value => FALSE);
dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
name => 'SQLTERMINATOR', value => TRUE);
:c := dbms_metadata.fetch_clob(handle => l_handle);
dbms_metadata.close(l_handle);
end;
/
을 지금 c
변수는 DDL은 보유 :
print c
C
---------------------------------------------
CREATE TABLE "ORDER"."T42" ("ID" NUMBER) ;
익명 블록 및 SQL * Plus 변수를 사용하는 대신 오브젝트 유형 및 오브젝트 이름을 사용하고 DDL을 CLOB로 리턴하는 함수로 변환 할 수 있습니다.
스키마를 지정하지 않는 것이 좋습니다. 스키마를 지정하지 않으면 소스 제어에 포함 시키거나 다른 환경에서 사용할 수 있습니다. 이를 수행하려면 null 대신 새 스키마를 전달하십시오.
dbms_metadata.set_remap_param(transform_handle => l_transform_handle,
name => 'REMAP_SCHEMA', old_value => USER, new_value => null);
C
-------------------------------------
CREATE TABLE "T42" ("ID" NUMBER) ;
dbms_metadata를 사용하여 DDL을 얻는 방법은 무엇입니까? –
예 metadata.get_DDL 사용 – Prabhu
'replace ('prabhu_order.', 'order.')'? – Ben