oracle - 如何在 oracle 中使用 get_ddl 从创建表脚本中忽略创建分段脚本?
问题描述
我正在研究 java 项目,在该项目中我们get_ddl
使用Oracle 12c
.
例如,我的表名是PARENT_EMP,架构是SECONDARYUSER,那么我正在使用 get_ddl 方法。
select dbms.get_ddl('TABLE','PARENT_EMP','SECONDARYUSER') from dual;
在执行上述语句之前,我正在执行以下脚本以忽略 ddl 中的约束和表空间。
begin
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'STORAGE',false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'REF_CONSTRAINTS', false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'TABLESPACE',false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES', false);
dbms_metadata.set_transform_param (dbms_metadata.session_transform,'CONSTRAINTS', false);
end;
但我的问题是,一些表有 REFERENCE PARTITIONED,如果我使用 get_ddl 方法获得 ddl,那么我也会获得外部约束脚本。
父表 DDl 是:-
create table parent_emp(
empno number primary key,
job varchar2(20),
sal number(7,2),
deptno number(2)
)
partition by list(job)
( partition p_job_dba values ('DBA'),
partition p_job_mgr values ('MGR'),
partition p_job_vp values ('VP')
);
子表 DDl 是:
CREATE TABLE "SECONDARYUSER"."REFERENCE_EMP"
(
"ENAME" VARCHAR2(10),
"EMP_ID" NUMBER,
"EMPNO" NUMBER,
CONSTRAINT "FK_EMPNO" FOREIGN KEY ("EMPNO")
REFERENCES "SECONDARYUSER"."PARENT_EMP" ("EMPNO") ENABLE
)
PARTITION BY REFERENCE ("FK_EMPNO")
(PARTITION "P_JOB_DBA" ,
PARTITION "P_JOB_MGR" ,
PARTITION "P_JOB_VP" ) "
请建议如何在没有外部约束和分区 ddl 的情况下获取子表 ddl ,或者如何使用 alter table 在已创建的表上创建分区。还有什么方法可以使用get_ddl
方法来获得分区的 ddl 吗?
解决方案
我刚刚找到了答案。
您缺少此声明:
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'PARTITIONING',false);
包含它,它将忽略带有“分区”的部分。
所以,你需要那些:
exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'CONSTRAINTS',false);
exec DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'REF_CONSTRAINTS',false);
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'PARTITIONING',false);
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'TABLESPACE',false);
exec dbms_metadata.set_transform_param (dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES', false);
学分: this的答案之一。
推荐阅读
- reactjs - React.useEffect 可以处理异步 EffectCallback 返回吗?
- heroku - 更改数据库资源的“计费对象”应用程序
- python - python pandas交叉表的问题
- javascript - 如何使用悬停弹出窗口和超链接链接特定对象中的图片
- python - 在 python 中为 django 使用 mailgun 沙箱时出现错误“SMTPSenderRefused at /accounts/password_reset/”
- transactions - 以太坊区块链状态如何更新?
- neo4j - 如何在 neo4j 密码查询中收集唯一相关行?
- reactjs - 如何从 contextApi 为 nextjs 中的一组特定路由提供上下文并通过链接保留路由状态?
- python - python列表中的负号交换
- mysql - 无法通过 unix 套接字使用 DataGrip 连接到 MySQL