报表中的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.ora和LISTENER.ORA中用到,通常SID与SQL 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服务器所在IP,DATABASE是数据库名。
二、 修改ORACLE监听文件,ORACLE_HOME/NETWORK/ADMIN/LISTENER.ORA文件里增加以下内容
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=tg4msql)#对应透明网关安装目录tg4msql\admin下的inittg4msql.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服务器的IP和PORT
(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服务器的IP和PORT
(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 Server的Database 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>
经测试问题解决,可以通过此属性来控制自动提交功能