dbms_metadata.get_ddl包取本地对象的DDL是没有问题的,但在这个工具中,需要通过DBLINK方式取远端数据库的DDL,经过一番资料查找,找到了解决方法。
首先尝试直接在dual用dblink,结果出错:
SQL> SELECT (DBMS_METADATA.GET_DDL('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230;
SELECT (DBMS_METADATA.GET_DDL('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230
ORA-31603: object "NEW_A" of type TABLE not found in schema "ADMIN"
ORA-06512: at "SYS.DBMS_METADATA", line 1548
ORA-06512: at "SYS.DBMS_METADATA", line 1585
ORA-06512: at "SYS.DBMS_METADATA", line 1902
ORA-06512: at "SYS.DBMS_METADATA", line 2793
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1
ADMIN.NEW_A在DB230是存在的,从这个错误可以看出,直接在dual表加dblink是没有意义的,dbms_metadata还是会从本地数据库查看表是否存在。
接着修改一下SQL,在dbms_metadata也加上dblink,看看结果如何:
SQL> SELECT DBMS_METADATA.GET_DDL@DB230('TABLE', 'NEW_A', 'ADMIN') FROM DUAL@DB230;
SELECT DBMS_METADATA.GET_DDL@DB230('TABLE', 'NEW_A', 'ADMIN') FROM DUAL@DB230
ORA-22992: cannot use LOB locators selected from remote tables
现在错误变了,说明在dbms_metadata上加dblink奏效了。新的错误很明显,在SQL方式下,不能直接通过dblink传送lob,所以需要想办法把lob转换为其他类型再传送:
SQL> SELECT DBMS_LOB.SUBSTR@DB230(DBMS_METADATA.GET_DDL@DB230('TABLE', 'NEW_A', 'ADMIN')) FROM DUAL@DB230;
DBMS_LOB.SUBSTR@DB230(DBMS_MET
--------------------------------------------------------------------------------
CREATE TABLE "ADMIN"."NEW_A"
( "TABLE_NAME" VARCHAR2(32),
"D" DATE,
"BYTES" NUMBER
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 81920 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "ADMIN_TS"
可以看到,此时远端数据库的DDL已经被成功取过来。注意dbms_lob也要加上dblink,表名在远端数据库执行这个函数。
最后简单总结一下:
1.函数和表都可以加dblink,函数加上dblink表示在远端数据库执行该函数,表加上dblink表示从远端数据库读取表。
2. 从远端数据库取DDL,所有函数及表(dbms_metadata/dbms_lob/dual)都要加上dblink,否则会失败
3. 此种方法最多返回32767个字节,如果对象的DDL长度大于32767,则只能部分返回。在处理里需特别处理(如分段取DDL)。
4. 如果是在PL/SQL中取远端数据库对象的DDL,则可以不用dbms_lob,通过变量赋值的方式不需要dbms_lob截断,如:
BEGIN
SELECT DBMS_METADATA.GET_DDL@DB230('TABLE','NEW_A','ADMIN') into V FROM DUAL@DB230;
END;
参考至:http://blog.csdn.net/liqfyiyi/article/details/7436366
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
本周由于公司一个系统的oracle数据库需要采集另一个系统mysql数据库的数据,于是对oracle通过dblink连接mysql进行了研究,测试环境是单实例oracle 10g 64位,折腾了半天搞定了,但是生产环境是10g rac,原本以为会很...
dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink dblink
oracle通过DBlink连接mysql搭建过程
本文详细描述了在oracle10g或11g中使用dblink访问sql server,使用oracle的透明网关来访问异构的数据库,方便一些习惯使用oracle的开发人员操作sql server数据库
通过dblink连接oracle和mysql,将数据从oracle传输到mysql,详细记录了搭建过程和创建报错
依赖包:mysql-connector-odbc-5.3.6-1.el6.x86_64.rpm和unixODBC,前置条件:Oracle和MySQL字符集需要一致,否则Oracle查询出来的数据是乱码。
Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置 Oracle之dblink的配置
oracle通过dblink连接mysql,主要参考了网上的文章,由于本人oracle服务端是32位,MySQL是64,附件中包含32位驱动 mysql-connector-odbc-5.2.4-ansi-win32.msi
DBLINk
Oracle10g通过DBLink访问MySQL数据(Windows)
oracle通过dblink链接 mysql和mssql例子 databaselink是定义一个数据库到另一个数据库的路径的对象,databaselink允许 你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意 的是...
oracle通过ODBC建立dblink访问SqlServer数据库配置
Oracle10g通过DBLink访问MySQL数据 安装环境:Windows_Server2003, Oracle10gR2, MySQL4(服务器版在另外电脑上),MySql-Connector3.51(客户端ODBC驱动) 。
通过Oracle的透明网关和dblink直接取sqlserver表中的数据
oracle通过odbc方式,连接到sqlserver数据库。比透明网关方式更加简单
NULL 博文链接:https://czwlucky.iteye.com/blog/964093
Linux下ORACLE 使用dblink连接mysql_lijilinjy的专栏-CSDN博客.mhtml
DBlink的应用 DBlink的应用 DBlink的应用
orcle dblink 的创建与删除的详解及实例 易混淆术语介绍:Db_name,Db_domain,Global_name,Service_name 删除 Dblink 报错 ORA-02024: database link not found 的解决方法 .
oracle 创建dblink的详细步骤,以及使用oracle快照快速的刷新,保持本地与远程数据库的同步