我想要表的DDLs,这样我就可以使用Oracle中的UTL包将其放到数据库服务器上。
问题是:当我们
select dbms_metadata.get_ddl('TABLE','Table_name','Schema_Name')
from dual; 我得到一个输出,它在CREATE之前包含CLOB。喜欢
"(CLOB)
CREATE TABLE "SCHEMA"."TABLE_NAME"
(TABLE_COLUMNS.....) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
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 "INTF_DATA01" ;"我想要的是上面的DDL,没有CLOB和参数,如SEGMENT CREATION,PCTFREE ...等等。
会很乐意得到建议的。
发布于 2013-01-30 21:41:46
我们可以使用DBMS_METADATA.SET_TRANSFORM_PARAM方法来控制在生成的DDL中包含哪些子句。
例如,要排除段内容,您可以执行以下命令
exec dbms_metadata.set_transform_param
(dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',false);在执行get_ddl()调用之前。
软件包文档列出了所有可用的转换参数。Find out more。
我认为Alex是对的,前面的"(CLOB)“是您的客户端在输出前添加的东西。但它是真实的,而不是人工制品,摆脱它将是一个简单的字符串操作:
substr(your_string, 7) 发布于 2015-04-23 22:41:32
CREATE OR REPLACE TYPE ddl_ty AS OBJECT ( object_name
VARCHAR2(30), object_type VARCHAR2(30), orig_schema
VARCHAR2(30), orig_ddl CLOB ) / CREATE OR REPLACE TYPE
ddl_ty_tb AS TABLE OF ddl_ty /
CREATE OR REPLACE FUNCTION get_object_ddl (input_values
SYS_REFCURSOR) RETURN ddl_ty_tb PIPELINED IS
PRAGMA AUTONOMOUS_TRANSACTION;
-- variables to be passed in by sys_refcursor */ object_name VARCHAR2(30); object_type VARCHAR2(30); orig_schema VARCHAR2(30);
-- setup output record of TYPE tableddl_ty out_rec ddl_ty := ddl_ty(NULL,NULL,NULL,NULL);
/* setup handles to be used for setup and fetching metadata
information handles are used to keep track of the different objects
(DDL) we will be referencing in the PL/SQL code */ hOpenOrig
NUMBER; hModifyOrig NUMBER; hTransDDL NUMBER; dmsf
PLS_INTEGER; Orig_ddl CLOB; ret NUMBER; BEGIN /* Strip off
Attributes not concerned with in DDL. If you are concerned with
TABLESPACE, STORAGE, or SEGMENT information just comment out these few lines. */ dmsf := dbms_metadata.session_transform;
dbms_metadata.set_transform_param(dmsf, 'TABLESPACE', FALSE);
dbms_metadata.set_transform_param(dmsf, 'STORAGE', FALSE);
dbms_metadata.set_transform_param(dmsf, 'SEGMENT_ATTRIBUTES',
FALSE); dbms_metadata.set_transform_param(dmsf, 'PRETTY', TRUE);
dbms_metadata.set_transform_param(dmsf, 'SQLTERMINATOR', TRUE);
-- Loop through each of the rows passed in by the reference cursor
LOOP
/* Fetch the input cursor into PL/SQL variables */
FETCH input_values INTO object_name, orig_schema, object_type;
EXIT WHEN input_values%NOTFOUND;
hOpenOrig := dbms_metadata.open(object_type);
dbms_metadata.set_filter(hOpenOrig,'NAME',object_name);
dbms_metadata.set_filter(hOpenOrig,'SCHEMA',orig_schema);
hModifyOrig := dbms_metadata.add_transform(hOpenOrig,'MODIFY');
dbms_metadata.set_remap_param(hModifyOrig,'REMAP_SCHEMA',orig_schema,null);
-- This states to created DDL instead of XML to be compared
hTransDDL := dbms_metadata.add_transform(hOpenOrig ,'DDL');
Orig_ddl := dbms_metadata.fetch_clob(hOpenOrig);
out_rec.object_name := object_name;
out_rec.object_type := object_type;
out_rec.orig_schema := orig_schema;
out_rec.orig_ddl := Orig_ddl;
PIPE ROW(out_rec);
-- Cleanup and release the handles
dbms_metadata.close(hOpenOrig);
END LOOP; RETURN; END get_object_ddl; / SELECT * FROM
TABLE(get_object_ddl(CURSOR (SELECT object_name, owner, object_type
FROM dba_objects
WHERE owner = 'EMP'
AND object_type IN
('VIEW',
'TABLE',
'TYPE',
'PACKAGE',
'PROCEDURE',
'FUNCTION',
'SEQUENCE'))));发布于 2015-03-28 16:56:13
get_ddl返回一个CLOB。将其转换为字符类型,您的库将不会添加(CLOB)。
select to_char(dbms_metadata.get_ddl('TABLE','Table_name','Schema_Name'))
from dual; https://stackoverflow.com/questions/14604827
复制相似问题