达梦DBLINK之DM访问Oracle问题处理

article/2025/9/13 9:26:22

达梦DBLINK之DM访问Oracle配置步骤

下面所有的问题基本上都是在使用ODBC的方式创建DBLINK时遇到,所以强烈建议DM访问Oracle的DBLINK创建时采用Oracle OCI来进行访问。

强烈建议使用Oracle OCI的方式创建DBLINK
强烈建议使用Oracle OCI的方式创建DBLINK
强烈建议使用Oracle OCI的方式创建DBLINK

问题1:DBLINK加载动态库失败

使用DBLINK访问Oracle目的端报错"DBLINK加载库文件失败"

SQL> select * from t1@link1;
select * from t1@link1;
[-2245]:Error in line: 1
DBLINK load library fail.

原因

(1)第一种情况:DM DBLINK使用的是ODBC方式创建,一般是由于Oracle odbc驱动包缺少依赖库文件导致。

(2)第二种情况:DM DBLINK使用的是Oracle OCI方式创建,一般是由于DM数据库未加载Oracle OCI驱动,需要重启DM数据库。(前提是LD_LIBRARY_PATH或者ldconfig配置正确)

解决办法

(1)第一种情况的解决办法

首先,使用ldd命令检查Oracle odbc驱动包是否缺少依赖库文件。如下:

[root@localhost instantclient_19_13]# ldd libsqora.so.19.1 linux-vdso.so.1 =>  (0x00007ffeef3cd000)libdl.so.2 => /lib64/libdl.so.2 (0x00007ffafac45000)libm.so.6 => /lib64/libm.so.6 (0x00007ffafa943000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffafa727000)libnsl.so.1 => /lib64/libnsl.so.1 (0x00007ffafa50d000)librt.so.1 => /lib64/librt.so.1 (0x00007ffafa305000)libaio.so.1 => /lib64/libaio.so.1 (0x00007ffafa103000)libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ffaf9ee9000)libclntsh.so.19.1 => /opt/oracle/instantclient_19_13/libclntsh.so.19.1 (0x00007ffaf5d76000)libclntshcore.so.19.1 => /opt/oracle/instantclient_19_13/libclntshcore.so.19.1 (0x00007ffaf57d2000)libodbcinst.so.2 => not found        ###这里缺少依赖libc.so.6 => /lib64/libc.so.6 (0x00007ffaf5404000)/lib64/ld-linux-x86-64.so.2 (0x00007ffafb103000)libnnz19.so => /opt/oracle/instantclient_19_13/libnnz19.so (0x00007ffaf4d92000)

然后,使用find命令查找系统上对应的动态库文件,查找到之后加入到LD_LIBRARY_PATH系统环境变量,或者添加到 /etc/ld.so.conf.d目录下指定的配置文件中。如下:

[root@localhost ~]# echo /usr/local/lib > /etc/ld.so.conf.d/libodbc.conf
[root@localhost ~]# ldconfig

(2)第二种情况的解决办法

需要重启DM数据库服务,重启服务后数据库会加载Oracle OCI驱动,然后可以正常使用DBLINK访问Oracle数据库。

问题2:查询的表为非DBLINK用户下的表

DBLINK使用odbc方式在某些版本中存在查询目的表并非指定用户下的表,需要在查询语句中指定用户名或者模式名前缀。

现象如下:

image-20211025230041143

原因:

不加用户名或者模式名前缀,实际查询的是sys用户下的对象。

解决办法

方法1:数据库升级到更高版本(比如2-70版本)

方法2:在访问的对象前面加上目的表的用户名或者模式名

方法3(推荐):DBLINK创建不使用ODBC的方式,使用Oracle OCI进行访问。如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。

问题3:查询公共同义词等公共对象失败

在高版本上(1-2-70版本),DBLINK使用ODBC方式查询公共同义词等,包括动态性能视图等,会直接报错。报错信息如下:

image-20211026103954961

在低版本中是可以正常访问,原因见问题2

原因:

初步判断可能是为了解决低版本下使用DBLINK访问时不加目的表的用户名或者模式名前缀无法访问DBLINK用户下的表的问题,即问题2。而在高版本中为了解决问题2,使用DBLINK访问时会自动给SQL语句访问对象添加一个DBLINK用户名前缀,所以导致在该版本中操作非DBLINK用户下的对象时报错。

解决办法

方法1(推荐):DBLINK创建不使用ODBC的方式,使用Oracle OCI进行访问。如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。

方法2:在Oracle数据库中对应用户下创建有权限访问的非本用户下的对象同义词

类似操作如下:

Oracle数据库:

SQL> conn scott/oracle
已连接。
SQL> show user
USER"SCOTT"SQL> create or replace synonym v$version for sys.v_$version;同义词已创建。SQL> select *from scott.v$version;BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE	11.2.0.4.0	Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - ProductionSQL> 

达梦数据库中查询:

SQL> select * from v$version@linkodbc1;行号     BANNER                                                                      
---------- ----------------------------------------------------------------------------
1          Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
2          PL/SQL Release 11.2.0.4.0 - Production
3          CORE 11.2.0.4.0 Production
4          TNS for Linux: Version 11.2.0.4.0 - Production
5          NLSRTL Version 11.2.0.4.0 - Production已用时间: 512.946(毫秒). 执行号:2301.

问题4:查询中文数据显示为问号

DBLINK使用ODBC方式访问目的表时,中文显示为问号。

image-20211026122203432

isql直接访问:

image-20211026122404623

可以看到上面,isql直接访问Oracle和达梦通过ODBC数据源访问创建DBLINK访问Oracle时,中文会显示乱码,一般是与客户端字符集环境有关,可以通过设置NLS_LANG环境变量指定客户端字符集。如下:

##配置与Oracle数据库相同的NLS环境
SQL> select * from v$nls_parameters;PARAMETER							 VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_LANGUAGE							 AMERICAN
NLS_TERRITORY							 AMERICA
NLS_CURRENCY							 $
NLS_ISO_CURRENCY						 AMERICA
NLS_NUMERIC_CHARACTERS						 .,
NLS_CALENDAR							 GREGORIAN
NLS_DATE_FORMAT 						 DD-MON-RR
NLS_DATE_LANGUAGE						 AMERICAN
NLS_CHARACTERSET						 ZHS16GBK
NLS_SORT							 BINARY
NLS_TIME_FORMAT 						 HH.MI.SSXFF AMPARAMETER							 VALUE
---------------------------------------------------------------- ----------------------------------------------------------------
NLS_TIMESTAMP_FORMAT						 DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT						 HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT 					 DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY						 $
NLS_NCHAR_CHARACTERSET						 AL16UTF16
NLS_COMP							 BINARY
NLS_LENGTH_SEMANTICS						 BYTE
NLS_NCHAR_CONV_EXCP						 FALSE##配置NLS_LANG环境变量,添加到.bash_profile中
[dmdba@localhost bin]$ vim ~/.bash_profile   ---添加下面内容
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"[dmdba@localhost bin]$ source ~/.bash_profile
[dmdba@localhost bin]$ env|grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

生效后,再次使用isql进行查询正常

[dmdba@localhost bin]$ isql -v ORA11 scott oracle
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select * from t1;
+---------------------+-----------------------------------------+----+-----------------------------------------+
| NAME                | AGE                                     | SEX| GRADE                                   |
+---------------------+-----------------------------------------+----+-----------------------------------------+
| 丽丽              | 18                                      || 1000                                    |
+---------------------+-----------------------------------------+----+-----------------------------------------+
SQLRowCount returns -1
1 rows fetched
SQL> quit

但是DBLINK中还是乱码

image-20211026122607965

原因

由于DM数据库启动时未将NLS_LANG环境变量加载导致。

如果在DM数据库启动时未加载到NLS_LANG环境变量,即使是disql窗口配置了NLS_LANG环境变量并生效也是无法正常显示中文的,所以在配置NLS_LANG环境变量生效后,需要在当前会话窗口重启DM数据库后才能正常显示中文。

如下:

情况1:配置NLS_LANG生效后启动DM数据库,然后disql窗口未配置NLS_LANG,查询正常正常

image-20211028115634454

image-20211028115701295

情况2:DM数据库启动会话窗口未配置NLS_LANG,disql窗口配置了NLS_LANG之后,查询中文显示问号

image-20211028115731897

image-20211028115751478

解决办法

方法一:使用Oracle OCI的方式创建DBLINK。如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。

image-20211026123136131

方法二:配置好NLS_LANG环境变量并生效后,在当前窗口重启DM数据库服务

问题5:查询报错“字符串不完整”

DBLINK使用ODBC方式创建,重启数据库之后,访问目的端表报错 “[-70037]:字符串不完整”。

image-20211026125841557

原因

问题4:“查询中文数据显示为问号”

解决办法

同问题4:“查询中文数据显示为问号”

问题六:使用select count()报错

DBLINK使用ODBC数据源方式创建,无法使用count,直接报错。
现象:

image-20211026123436259

使用OCI方式创建DBLINK,可以正常执行。

image-20211026123545076

使用isql直接访问Oracle数据库执行正常。

image-20211026123752834

解决办法

第一种办法:升级数据库版本到2021年12月之后的版本。
第二种办法:使用Oracle OCI的方式创建DBLINK。

如果数据库启动时未加载Oracle OCI驱动,需要重启数据库加载Oracle OCI驱动。
该问题以在后面版本中修复解决。

更多资讯请上达梦技术社区了解:https://eco.dameng.com


http://chatgpt.dhexx.cn/article/fAlbwkco.shtml

相关文章

linux oracle dblink,Oracle dblink配置

一. dBlink 简述 dblink(Database Link)数据库链接顾名思义就是数据库的链接,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库…

DBlink 初级使用文档

DBlink 初级使用文档 提示:本文主要帮助新手讲解DBlink的基础用法 文章目录 DBlink 初级使用文档前言一句话解释DBlink是干啥用的 一、DBlink的分类二、DBlink的使用1.使用前查看权限2.创建DBlink3.简单的跨库使用 总结 前言 一句话解释DBlink是干啥用的 实现跨库…

oracle----dblink知识详解

一. dblink定义 dblink(Database Link)数据库链接顾名思义就是数据库的链接,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样…

DBlink

DBlink 文章目录 DBlink一、dblink是什么?二、Oracle数据库建立dblink1.语句方式2.PL/SQL developer图形界面化方式 三、查看是否成功建立dblink 一、dblink是什么? 个人理解:dblink在一个数据库中访问另一个数据库建立起来的通道。 二、Or…

Oracle dblink详解

Oracle dblink详解 概述 1、database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。 2、在创建database link的…

Web应用快速开发平台 WebBuilder 8.6 企业版发布

WebBuilder是一款强大的企业级Web应用快速开发平台,使用WebBuilder可以快速开发出强大而高效的跨平台的常规应用和移动应用系统。 WebBuilder官网:http://www.geejing.com 社区:http://www.putdb.com/ 版本更新记录 2019-06-21 发布 V8.6 …

使用Eclipse来开发调试WebBuilder项目

使用Eclipse来开发调试WebBuilder项目 下载,安装Groovy插件: 下载地址: Groovy-Eclipse 下载,安装Tomcat插件: 下载地址: Tomca-Eclipse 打开Eclipse,配置Tomcat插件,如下图所示: 新建一个Java Project项目 ​ 命名为WB8,然后在项目的右键菜单里,添加Groovy支持!如下图所示: 打…

Web软件快速开发平台WebBuilder V8.7.1发布

WebBuilder是一款强大,全面和高效的应用开发和运行平台。基于浏览器的集成开发环境,可视化和智能化的设计,能轻松完成常规应用和面向手机的移动应用开发。高效、稳定和可扩展的特点,适合复杂企业级应用的运行。跨平台、数据库和浏…

快速开发平台 WebBuilder 8.4 发布

WebBuilder是一款强大,全面和高效的应用开发和运行平台。基于浏览器的集成开发环境,可视化和智能化的设计,能轻松完成常规应用和面向手机的移动应用开发。高效、稳定和可扩展的特点,适合复杂企业级应用的运行。跨平台、数据库和浏…

Web软件快速开发平台 WebBuilder 8.7 发布

WebBuilder是一款强大,全面和高效的应用开发和运行平台。基于浏览器的集成开发环境,可视化和智能化的设计,能轻松完成常规应用和面向手机的移动应用开发。高效、稳定和可扩展的特点,适合复杂企业级应用的运行。跨平台、数据库和浏…

WebBuilder的下载以及实现连接Oracle数据

WebBuilder的下载网上有许多就不说了。 首先解压压缩包当中的wb文件到Tomcat的webapp当中去如图: 将压缩包中的wb文件解压到Tomcat中 打开wb问价夹创建一个META-INF文件夹 在meta-inf文件夹当中创建一个context.xml文件 context.xml文件党总的内容为: <?xml version"…

webbuilder连接mysql_Webbuilder学习指导书.doc

您所在位置&#xff1a;网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspWeb服务 Webbuilder学习指导书.doc60页 本文档一共被下载&#xff1a;次,您可全文免费在线阅读后下载本文档。 下载提示 1.本站不保证该用户上传的文档完整性&#xff0c;不…

005-WebBuilder使用结构元素进行网页布局

这个太零散了直接在代码上写的注释&#xff0c;第一份前端代码 <!DOCTYPE html> <html> <!--文档基本结构--><head><!--设置section或者page的页眉--><meta charset"utf-8" /><!--meta网页元信息--><title>业务种类…

Webbuilder取值记录

一、从module.serverScript页面返回数据方法&#xff1a; 在B 的dataprovider中写SQL语句&#xff0c;也可以直接在serverScript中写&#xff0c;如果在serverScript中写的话&#xff0c;应该是必须进行app.send();一下&#xff0c;&#xff08;我也没试不send能不能接收&#…

003-Webbuilder应用HTML表单

HTML和控件的混合编程 通常普通的表单界面使用UI控件来构建&#xff0c;对于复杂的界面也可以使用HTML来直接构建&#xff0c;WebBuilder中提供特定的语法可以把相关的控件比如日期控件插入到指定的DOM位置。HTML和控件的混合编程一方面可以使界面的构建更加灵活&#xff0c;另…

004-webbuilder所有布局

viewport viewport表示整个页面的显示视口&#xff0c;他把页面渲染到浏览器的body中&#xff0c;他的大小等于浏览器body的大小,如果整个页面需要占据整个浏览器body(全屏显示)&#xff0c;可以使用该控件作为顶层控件。大部分需要在浏览器中显示的模块通常都会使用viewport作…

001-WebBuilder安装和部署

运行环境 WebBuilder是一款通用平台&#xff0c;但是我们用windows 操作系统&#xff1a;win10JDK环境&#xff1a;1.8服务器&#xff1a;tomcat数据库&#xff1a;SqlServer浏览器&#xff1a;Chrome移动设备&#xff1a;安卓 安装WebBuilder 通常只要复制WebBuilder应用目…

WebBuilder开发笔记

WebBuilder开发笔记记录 基础知识 WebBuilder快捷键 控件配置 双击左侧控件箱中的控件将打开该控件&#xff0c;控件编辑器由General、Configs和Events 3个标签页组成&#xff0c;分别代表控件的常规属性、配置项属性和事件。 General标签页&#xff1a; autoCreate&#xff…

010-WebBuilder-编写可复用模块+阶段实战效果与代码

编写可复用模块 可复用的模块是指某个模块可以作为公共模块应用到其它模块中,开发大型项目时,构建高度可复用的模块,对质量和系统的可维护性具有重要意义. WebBuilder具有很强的模块复用能力,构建的模块可通过多种方式被别的模块引用.引用的模块和被引用的模块可以相互访问,使…

webbuilder mysql_快速开发平台 WebBuilder 8 的 安装

WebBuilder是一款强大&#xff0c;全面和高效的应用开发和运行平台。基于浏览器的集成开发环境&#xff0c;可视化和智能化的设计&#xff0c;能轻松完成常规应用和面向手机的移动应用开发。包含多项先进技术&#xff0c;使应用系统的开发更快捷和简单。 运行环境和系统安装 We…