暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 获取各种对象的DDL

askTom 2017-09-06
582

问题描述

我必须将一些对象从一个架构复制到同一数据库上的另一个,在其他java源中也是如此。dbms_metadata.get_ddl(object_type,object_name,schema_name) 返回ddl中的架构名称。因为我想在新架构上执行这个ddl,所以ddl中的旧架构名称对我的工作没有帮助。这里是一个在Oracle的虚拟机上测试数据库12.2的示例。

execute dbms_metadata.set_transform_param(dbms_metadata.session_transform,'EMIT_SCHEMA', false);
select dbms_metadata.get_ddl('TABLE', 'DEPARTMENTS', 'HR') from dual;
复制


它的工作原理 (这意味着,它省略了ddl中的模式名称),但在java源代码的情况下:

execute dbms_metadata.set_transform_param(dbms_metadata.session_transform,'EMIT_SCHEMA', false);
select dbms_metadata.get_ddl('JAVA_SOURCE', 'ZipManager', 'XDBPM') from dual;
复制


它没有 (这意味着,它在ddl中添加了模式名称)!

我的数据库是11.2的。与我的表和java源相同的行为。

是虫子吗?有什么变通办法吗?

问候,贾塞克

专家解答

EMIT_SCHEMA是没有记录的。所以你不应该用这个。

放弃架构的正确方法是使用remp_schema,如MOS note 1067292.1所示:

set long 100
var h number
var ddl_handle number
var modify_handle number
exec :h := DBMS_METADATA.OPEN('TABLE')
exec dbms_metadata.set_filter(:h,'SCHEMA','HR');
exec :modify_handle := DBMS_METADATA.ADD_TRANSFORM(:h,'MODIFY')
exec DBMS_METADATA.SET_REMAP_PARAM(:modify_handle,'REMAP_SCHEMA','HR','')
exec :ddl_handle := DBMS_METADATA.ADD_TRANSFORM(:h,'DDL')
exec DBMS_METADATA.SET_FILTER(:h, 'NAME','DEPARTMENTS')
select DBMS_METADATA.fetch_clob(:h) from dual;

DBMS_METADATA.FETCH_CLOB(:H)                                                                          

  CREATE TABLE "DEPARTMENTS" 
   ( "DEPARTMENT_ID" NUMBER(4,0), 
 "DEPARTMENT_NAME" VARCHAR2(30) CO  

exec DBMS_METADATA.close(:h)
复制


可悲的是,Java source似乎存在一个错误,这意味着该模式被替换为空双引号 “”,而不是什么都没有:

select user, name, line, text
from   user_source
where  type = 'JAVA SOURCE'
and    line <= 5;

USER   NAME           LINE  TEXT                                    
CHRIS  TEST_ENCODING  1     import java.io.BufferedReader;
CHRIS  TEST_ENCODING  2     import java.io.ByteArrayInputStream;
CHRIS  TEST_ENCODING  3     import java.io.ByteArrayOutputStream;
CHRIS  TEST_ENCODING  4     import java.io.FileInputStream;
CHRIS  TEST_ENCODING  5     import java.io.InputStream;

var h number
var ddl_handle number
var modify_handle number
exec :h := DBMS_METADATA.OPEN('JAVA_SOURCE')
exec :modify_handle := DBMS_METADATA.ADD_TRANSFORM(:h,'MODIFY')
exec DBMS_METADATA.SET_REMAP_PARAM(:modify_handle,'REMAP_SCHEMA','CHRIS','')
exec :ddl_handle := DBMS_METADATA.ADD_TRANSFORM(:h,'DDL')
exec DBMS_METADATA.SET_FILTER(:h, 'NAME','TEST_ENCODING')
select DBMS_METADATA.fetch_clob(:h) from dual;

DBMS_METADATA.FETCH_CLOB(:H)                                                                          

   CREATE JAVA SOURCE NAMED ""."TEST_ENCODING" AS 
 import java.io.BufferedReader;
import java.io.B

exec DBMS_METADATA.close(:h)
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论