知识库

推荐内容

快逸做的更好

产品优势

您的位置: 首页 > 知识库 > 报表中的DBLINK

报表中的DBLINK

报表中的 DBLINK

database link 概述

database link 是定义一个数据库到另一个数据库的路径的对象,他允许你查询远程表及

执行远程程序。在任何分布式环境里, database 都是必要的。另外要注意的是 database link

是单向的连接。

在创建 database link 的时候, Oracle 再数据字典中保存相关的 database link 的信息,在使用 database link 的时候, Oracle 通过 Oracle Net 用用户预先定义好的连接信息访问相应的远程数据库以完成相应的工作。

Oracle10g/11g 通过透明网关建立 database link

Oracle10g 11g 需要单独下载对应的透明网关安装包,官网上有对应的下载链接,安装时要注意应安装在已安装的 Oracle 数据库路径下。

下面以 SQL Server 为例描述下具体的修改步骤

10G sql server

安装完透明网关后:
透明网关安装目录tg4msql\admin下面默认有一个inittg4msql.ora文件(这种类型的文件命名规则init+sid.ora,这里的SID会在tnsname.oraLISTENER.ORA中用到,通常SIDSQL SERVER数据库名一致,如果需要连接多个SQL SERVER数据库,则需要在这个目录下建立多个文件。) 修改这个文件之后,不用重起数据库,也不用重起监听

一 、修改HS_FDS_CONNECT_INFO的值:
HS_FDS_CONNECT_INFO=”SERVER=10.21.2.22;DATABASE=tg4msql”
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
其中SERVER的值是SQL SERVER服务器所在IPDATABASE是数据库名。

二、 修改ORACLE监听文件,ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA文件里增加以下内容
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME= tg4msql )#
对应透明网关安装目录tg4msql\admin下的init tg4msql .ora文件名。
(ORACLE_HOME=D:\oracle\product\10.2.0\db_1)#
这里OARCLE安装目录
(PROGRAM= tg4msql)#
安装透明网关所在的文件名 tg4msql \admin


注:修改之后需重起监听

三、修改ORACLE_HOME/NETWORK/ADMIN/tnsname.ora文件,增
TG4MSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.71.62.31)(PORT = 1521))#
ORACLE服务器的IPPORT

(CONNECT_DATA =
(SID = tg4msql )#
对应透明网关安装目录tg4msql\admin下的inittg4msql.ora文件名。

(HS = OK)#
说明是异构数据库
)

DBLINK
create database link TG4MSQL
connect to user identified by 123
using ‘TG4MSQL’;–这里的TG4MSQL 对应tnsname.ora文件里的服务名。


11G 连接SQL SERVER

一、透明网关安装目录\dg4msql\admin下面默认有一个文件initdg4msql1.ora ,命名规则INIT+SID.ORA(如果需要连接多个SQL SERVER数据库,则需要在这个目录下建立多个文件。)
修改HS_FDS_CONNECT_INFO的值:
HS_FDS_CONNECT_INFO=10.3.52.141//PCPF_IIRS_PublishNew ##
10G不同
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER


二、 修改ORACLE监听文件,ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA文件里增加以下内容
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=dg4msql)#
对应透明网关安装目录tg4msql\admin下的inittg4msql.ora文件名。
(ORACLE_HOME=D:\app\wzj\product\11.1.0\db_1)#
这里OARCLE安装目录
(PROGRAM= dg4msql )#
安装透明网关所在的文件名 dg4msql \admin


注:修改之后需重起监听

三、修改ORACLE_HOME/NETWORK/ADMIN/tnsname.ora文件,增加
dg4msql =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.71.62.31)(PORT = 1521))#
ORACLE服务器的IPPORT

(CONNECT_DATA =
(SID = dg4msql)#
对应透明网关安装目录dg4msql\admin下的initdg4msql.ora文件名。

(HS = OK)#
说明是异构数据库
)

DBLINK
create database link DG4MSQL
connect to user identified by 123
using ‘dg4msql’;–这里的dg4msql 对应tnsname.ora文件里的服务名。

然后在PL/SQL中新建一个对应SQL ServerDatabase Link,并新建个数据集测试下,如下图

出了SQL server的数据就OK

Oracle 存储过程使用 DBLINK 的问题

客户反馈使用 Oracle 存储过程通过 DBLINK 调用 SQL Server 数据时,设计器会报错,并无法显示数据,具体报错如图

通过复杂 SQL 直接使用 DBLINK 是正常的

通过 JSP 实现存储过程的逻辑,发现如果不加红色的两行代码也会报同一中的错误)

CallableStatement proc = null;

proc = conn.prepareCall(“{ call fm_report_pack_jy.query_week_realdeal2(?,?,?,?) }”);

proc.setString(1, “106653″);

proc.setString(2, “2013-03-10″);

proc.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);

proc.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);

conn.setAutoCommit(false);

proc.execute();

rs = (ResultSet)proc.getObject(4);

while (rs.next()) {

out.print(rs.getString(1)+”—–”+rs.getString(2)+”<BR>”);

}

conn.commit();

最终发现 报表 4 的数据库运算中,其实并没有基于事务的处理模式,对于数据集计算中使用的数据库连接,是默认的自动提交模式,这就是本问题的错误原因:自动提交模式下,并不会在整个事务结束时统一提交。为此,在数据源配置中增添提交模式,默认为自动提交。当设为不自动提交时,在计算数据集或者报表中使用数据库函数时,均不会有提交操作,如果需要 db.commit() ,有两种方案,一是在存储过程中提交,二是在 DataSetFactoryListener 中执行。 DataSourceConfig 类已经增加属性,处理 DataSource 中的相应处理;还需处理 web 端的相应数据连接配置

2013 3 22 日之后的 report4.jar 已添加了对此属性的控制

reportConfig.xml dataSource 配置串的第 7 位增加了是否自动提交的配置,如
oracleDB,oracle,0,GBK,GBK,0,false
最后的 false 表示不自动提交
如果是 jdbc 数据库配置,则如下:
<jdbc-ds-config>
<name>oracleDB</name>
……
<autoCommit>false</autoCommit>
</jdbc-ds-config>

经测试问题解决,可以通过此属性来控制自动提交功能

发布日期:2013/04/02
本文分类: 知识库