我正在创建一个包来生成我的模式中的对象的DDL(您解析对象名称,并返回一个clobDDL),所以我可以生成文件,并将它们直接放入SVN.
我正在使用dbms_metadata.get_ddl它,它适用于除表/物化视图之外的所有对象.
如果我创建一个表:
create table stackoverflow
( col_1 varchar2(64)
, col_2 number
, col_3 date);
create index idx_test on stackoverflow(col_1);
alter table stackoverflow add constraint ui_test unique (col_2) using index;
Run Code Online (Sandbox Code Playgroud)
并生成DDL:
begin
dbms_output.put_line(dbms_metadata.get_ddl( object_type => 'TABLE'
, name => 'STACKOVERFLOW')
);
end;
Run Code Online (Sandbox Code Playgroud)
它给了我们:
CREATE TABLE "TEST_SCHEMA"."STACKOVERFLOW"
( "COL_1" VARCHAR2(64),
"COL_2" NUMBER,
"COL_3" DATE,
CONSTRAINT "UI_TEST" UNIQUE ("COL_2")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 131072 NEXT 131072 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE …Run Code Online (Sandbox Code Playgroud) 如何在DBMS_METADATA.GET_DDL没有模式名称的情况下为我的对象生成DDL脚本?
用DBMS_METADATA.GET_DDL:
CREATE TABLE "MYSCHEMA"."MYTABLE"
(
"COL1" NUMBER(10,0)
)
Run Code Online (Sandbox Code Playgroud)
SQL Developer可以做到这一点,我认为它也使用DBMS_METADATA来实现这个目标并生成DDL脚本.
使用SQL Developer:
CREATE TABLE "MYTABLE"
(
"COL1" NUMBER(10,0)
)
Run Code Online (Sandbox Code Playgroud) 对于数据库重新架构,我需要获取每个表的DDL并在数据库(Oracle)中查看.我不想去每个表/视图的属性,并在SQL Developer中从中获取SQL.
我使用以下方式成功获得了桌子的DDL
select dbms_metadata.get_ddl('TABLE','Table_name','Schema_Name')
from dual;
Run Code Online (Sandbox Code Playgroud)
但是面对VIEW和MVIEW的问题.任何人都可以为表以外的元素提供命令/关键字.
另外,我想将结果导出到excel文件中,第一列为TableName第二列,第二列为DDL.
我想为我的大多数数据库对象创建ddl脚本.dbms_metadata.get_ddl适用于大多数对象类型.例如,以下内容为视图创建ddl:
select dbms_metadata.get_ddl ( 'VIEW', 'SAMPLE_VIEW') from dual
Run Code Online (Sandbox Code Playgroud)
另一方面,它不适用于object_type'JOB'.下列:
select dbms_metadata.get_ddl( 'JOB', 'SAMPLE_JOB' ) from dual
Run Code Online (Sandbox Code Playgroud)
给出以下错误:
ORA-31604: invalid NAME parameter "NAME" for object type JOB in function SET_FILTER
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 116
ORA-06512: at "SYS.DBMS_METADATA_INT", line 4705
ORA-06512: at "SYS.DBMS_METADATA_INT", line 8582
ORA-06512: at "SYS.DBMS_METADATA", line 2882
ORA-06512: at "SYS.DBMS_METADATA", line 2748
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1
Run Code Online (Sandbox Code Playgroud)
如果我使用列出我的工作
select * from user_objects where object_type='JOB'
Run Code Online (Sandbox Code Playgroud)
它显示了SAMPLE_JOB(就像它显示了SAMPLE_VIEW,如果过滤了object_type ='VIEW').
为什么它适用于VIEW(以及TABLE,INDEX,TRIGGER,...)而不适用于JOB?
我正在使用Oracle 10g.
I am working on java project in which we are getting create table ddl using get_ddl method in Oracle 12c.
For example my table name is PARENT_EMP and schema is SECONDARYUSER then I am using get_ddl method.
select dbms.get_ddl('TABLE','PARENT_EMP','SECONDARYUSER') from dual;
Run Code Online (Sandbox Code Playgroud)
before executing above statement I am executing following script to ignore constrainst and table spaces from 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;
Run Code Online (Sandbox Code Playgroud)
但是我的问题是,某些表具有REFERENCE PARTITIONED,如果我使用get_ddl方法获得ddl,那么我也将获得外部约束脚本。
父表DDl是:-
create table parent_emp( …Run Code Online (Sandbox Code Playgroud) 我试图从user_objects表中获取CONSTRAINTS,如下所示:
select CASE object_type
WHEN 'DATABASE LINK' then 'dblinks'
WHEN 'FUNCTION' then 'functions'
WHEN 'INDEX' then 'indexes'
WHEN 'PACKAGE' then 'packages'
WHEN 'PROCEDURE' then 'procedures'
WHEN 'SEQUENCE' then 'sequences'
WHEN 'TABLE' then 'tables'
WHEN 'TRIGGER' then 'triggers'
WHEN 'VIEW' then 'views'
WHEN 'SYNONYM' then 'synonyms'
WHEN 'GRANT' then 'grants'
WHEN 'CONSTRAINT' then 'constraints'
ELSE object_type
END||'|'||
CASE object_type
WHEN 'DATABASE LINK' then 'DB_LINK'
ELSE object_type
END||'|'||object_name
from user_objects
where object_name not like 'BIN$%'
and object_type not like '%PARTITION'
and object_type …Run Code Online (Sandbox Code Playgroud)