PostRank

2009/02/26

異質資料庫練習

摘自:網路

1、安装 Microsoft Data Access Components (MDAC)SDK ODBC driver

2、test whether CATHS has run.connect to the Oracle server

as schema "SYSTEM" and do "DESCRIBE SYS.HS_FDS_CLASS".

If it does not exist, connect as SYS (or internal) and run

the CATHS script. (ORACLE_HOMERDBMSADMINCATHS.SQL)

3、建立 SQL SERVER 数据源

TEST_SQLSERVER

4、配置tnsnames.ora. (ORACLE_HOMENETWORKADMIN)

TEST_SQLSERVER =

(DESCRIPTION=

(ADDRESS=

(PROTOCOL=tcp)

(HOST=)

(PORT=1521)

)

(CONNECT_DATA=

(SID=TEST_SQLSERVER)

)

(HS=)

)

5、配置listener.ora. (ORACLE_HOMENETWORKADMIN)

(SID_DESC=

(SID_NAME=TEST_SQLSERVER)

(ORACLE_HOME=D:OracleiSuites)

(PROGRAM=hsodbc)

)

6、重启ORACLE监听.

CMD

LSNRCTL STOP

LSNRCTL START

LSNRCTL STATUS

7、添加网关配置文件. (ORACLE_HOMEHSADMIN)

文件名为:initTEST_SQLSERVER.ora

文件内容:

#

# HS init parameters

#

HS_FDS_CONNECT_INFO = TEST_SQLSERVER

HS_FDS_TRACE_LEVEL = 0

#HS_FDS_TRACE_FILE_NAME = TEST_SQLSERVER.trc

#

# Environment variables required for the non-Oracle system

#

#set =

8、进入ORACLE SQL*PLUS,建立数据库链.

CREATE DATABASE LINK TOSQL USING 'TEST_SQLSERVER';

ORACLE异类服务


象SQL SERVER的LINKED SERVER一样,ORACLE也能访问非ORACLE数据库,这是通过ORACLE异类服务(HS)实现的。从ORACLE开始引入并在 ORACLE8I版本中得到进一步扩充。ORACLE异类服务集成在ORACLE8I数据库服务器中,实现对非ORACLE系统的访问。根据访问非 ORACLE数据库方式的不同,ORACLE提供了两种不同的服务:
1. ORACLE开放互联(Generic Connectivity):是一个轻量级的互联方案,通过ODBC或OLE DB实现对非ORACLE数据库的访问。
2. ORACLE透明网关(Transparent Gateway):提供更健壮的互联方式,包括分布查询和分布式事务支持。
对希望访问的每一个非ORACLE数据库系统,都要求有一个异类服务代理(Heterogeneous Services Agent),它在ORACLE服务器和远程数据库间进行通讯,他包含了访问数据库时需要的特定数据库信息。
在 与非ORACLE系统进行通讯时,ORACLE捕获和存储SQL命令,并针对每一个远程数据原的特征转换信息。无论何时向远程数据库发送一个请 求,ORACLE都要查询存储的信息(该信息存在于ORACLE中以HS开头的数据字典中,详细请参照ORACLE HELP <>),将该请求转换为远程服务器能够处理的格式。

一. ORACLE8I通用互联
ORACLE8I通用互联在ORACLE8I服务器版本8.1.6中提供,他使用ODBC或OLD DB实现开放互联并与远程数据源通信。ORACLE8I服务器中同时提供ODBC 和OLE DB异类代理,不需再使用其他网络产品。
同时通用互联工作方式和编写ODBC, OLE DB客户端程序相似。主要区别似ORACLE服务器要先发起连接操作然后在与远程数据源通信,因此应用程序不需做任何修改。这种远程数据访问的优点是:
1. 很容易实现,客户应用不需做任何改变
2. 使用标准接口(ODBC,OLE DB)进行信息访问
3. 异类服务提供ORACLE数据类型到标准接口的数据类型转换
4. 支持SQL语言和内置函数
缺点是:不能执行远程存储过程,也不支持分布应用,只支持单节点事务,对有些数据类型的支持存在一些问题,譬如,SQL SERVER中image数据类型。不过对于一个不需要网关的数据源进行查询,采用通用互联还是有优势的。
二.ORACLE8I透明网关
针 对通用互联存在的限制,ORACLE8I透明网关对访问的非ORACLE数据源提供了更多特性支持。目前HS代理支持DB2,SYBASE,SQL SERVER和INFORMIX.。值得注意的是,通用互联以集成到ORACLE8I数据库服务器中并成为其中的一部分,而每个透明网管都必须单独购买 (ORACLE9I中包含透明网管组件)。
透明网关提供的功能:
1. 分布式事务:他允许一个事务跨越ORACLE和非ORACLE系统,保证事务要么完全提交要么完全会滚。
2. 透明SQL访问:集成两种不同的数据源使他们看上去一样,实际上,开发者不必担心两个系统间的语法差异,因为网管代理会将所用的SQL命令转换为目标数据库能够接受的语法格式。
3. 数据字典转换:与透明SQL访问一样,网关代理也将任意数据字典查询转换为非透明SQL访问系统的数据字典。
4. 直接传送SQL:给予程序员直接访问远程系统的能力。他能使开发者直接利用数据库特有的功能,但是此功能需要开发者了解目标数据库的语法,因为网关代理不对他进行转化。
5. 访问存储过程:允许程序执行存储过程,就像他是PL/SQL远程过程一样。

下面介绍透明网关提供的服务:
事 务服务:连接到远程系统时,事务服务要完成两个任务。第一,首次进行访问时在两个系统间建立一个身份确认Session,Session结束时断开此连 接,第二,事务服务扮演各个分布式事务间协调器的角色,它使用两阶段提交协议维护全局一致。为了实现分布式事务处理,需要使用MS DTC(MICROSOFT 分布事务协调器)在多个数据库之间协调两阶段提交过程。
SQL服务:SQL服务映射并转换ORACLE请求为远程系 统对应的语句。它使用异类服务数据字典表中存储的信息决定如何转换SQL请求才能使非ORACLE系统能够理解,其中包括将ORACLE系统函数转换为对 应的目标数据库函数,将ORACLE数据类型映射为相应的目标数据库的数据类型,以及数据字典的转换等。
过程服务:将存储过程映射为等价的目标数据库的过程,另外也使用存储在异类服务数据字典中的信息将ORACLE功能映射为目标数据库的功能。
三.建立异类服务代理环境
无论是使用通用互联还是透明网关,建立代理的步骤都是相同的。包括
1. 安装异类服务数据字典
该步骤完成在ORACLE数据库中创建数据字典表、视图和包。创建这些数据库对象的脚本是%ORACLE_HOME%RDBMSADMINCATHS.SQL文件。需要记住的是,运行该脚本必须以SYS或INTERNAL用户登陆。
创建这些对象的目的是保存远程系统的信息,这些信息包括功能翻译,SQL翻译和数据字典翻译。将信息存储在数据字典使访问数度加快,不必每次都查询目标数据库,这些信息相对来说是静态的。下面是异类服务使用的几个数据字典视图:
视图名称 描 述
HS_FDS_CLASS 允许访问的远程系统的类型信息
HS_FDS_INST 允许访问的远程系统中一个特殊类的每个实例信息
HS_CLASS_INIT 每个类的初始化参数信息
HS_INST_INIT 每个实例的初始化参数信息
HS_BASE_DD 异类服务能够翻译的所有ORACLE数据字典信息
HS_CLASS_DD 每个类的数据字典翻译内容信息
HS_INST_DD 每个实例的数据字典翻译内容信息
HS_BASE_CAPS 异类服务支持的功能信息
HS_CLASS_CAPS 每个类支持的功能信息
HS_INST_CAPS 每个实例支持的功能信息
HS_EXTERNAL_OBJECTS 分布式外部过程需要的信息



除了这些表和视图外,ORACLE还提供了DBMS_HS包,他完成对类、实例、初始化参数和异类服务支持的功能进行维护。详细请参考ORACLE ONLINE HELP<Distributed Database Systems>>。
2. 配置异类服务代理
配置异类服务比较简单,我个人认为理解异类服务的概念、架构和其提供的服务相对比较重要,因为只有了解了异类服务,才能对配置有深刻的理解。

对于通用互联,必须告诉异类服务将如何连接到非ORACLE系统,是使用ODBC 还是OLE DB。ORACLE提供了两个示例参数文件(位于%ORACLE_HOME%NETWORK
ADMIN目录下)inithsodbc.ora和inithsoledb.ora.
1).将inithsoledb.ora 文件拷贝为initGCSQL2000文件,参数文件名必须按照initGSID.ora进行命名转换,GSID是tnsnames.ora和listener.ora文件指定的网关系统标识符名称。
2).编辑initGCSQL2000.ora文件并更新以下内容:
HS_FDS_CONNECT_INFO=”UDLFILE=%ORACLE_HOME%ORA81HSADMINGCSQL2000.UDL”
#HS_FDS_TRACE_LEVEL=16
#HS_FDS_TRACE_FILE_NAME=
3). 在%ORACLE_HOME%ORA81HSADMIN中建立GCSQL2000.UDL,最简单的方法是建立GCSQL2000.txt文本文件,将其 文件名改为GCSQL2000..UDL,然后右击该文件,设置其属性,在属性对话框中选择正确的驱动程序并设置数据库连接属性,测试成功后退出。
4).重新启动监听器。

对于不同的数据库ORACLE提供了不同的透明网关,如下表所列,在这些目录下ORACLE提供了一些默认的参数文件,只要做简单的修改即可完成配置,下面以SQL SERVER为例进行配置,对于其他数据库的配置大同小异,读者可自己动手试试。
数据库类型 对应的ORACLE目录
SQL SERVER %ORACLE_HOME%ORA8TG4MSQL
DB2 %ORACLE_HOME%ORA8TG4DRDA
SYBASE %ORACLE_HOME%ORA8TG4SYBS

1). 将inittg4msql.ora 文件拷贝为initTGSQL2000文件,参数文件名必须按照initGSID.ora进行命名转换,GSID是tnsnames.ora和listener.ora文件指定的网关系统标识符名称。
2). 编辑initTGSQL2000.ora文件并更新SQL条目HS_FDS_CONNECT_INFO,用 SERVER_NAME.DATABASE_NAME指定为你想要连接的SQLSERVER数据库,例如,为了连接YLQ服务器上的Products数据 库,指定HS_FDS_CONNECT_INFO = YLQ.products即可。需要说明的是,对每个希望通过透明服务器代理进行访问的数据库,都需要一个独立的参数文件来包含正确的连接信息。
SQLSERVER透明网关目前还不支持SQL SERVER2000,并且不能连接到有实例名的SQLSERVER数据库上。

3. 配置监听器和Net8服务名
为 了ORACLE数据库能够与SQL SERVER数据库进行通信,首先必须配置NET8服务名,使ORACLE服务器能够与监听器进程识别的代理进行交互,需要注意的是服务名必须与异类服务 参数文件中指定的网关系统标识符(GSID)一致,另外NET8服务名中还必须包括HS=OK子句,以确保该连接能使用异类服务,下面是使用OLE DB和透明网关进行互联的TNSNAMES.ORA文件的例子:
MSOLEDB=(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=YLQ)(PORT=1521))
(CONNECT_DATA=(SID=GCSQL2000))
(HS=OK)
)

TGMSQL=(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=YLQ)(PORT=1521))
(CONNECT_DATA=(SID=TGSQL2000))
(HS=OK)
)
接下来便是配置监听器,使他能以指定的系统标识符监听异类服务的连接请求,当监听器收到请求后,把它传送给PROGRAM条目指定的代理程序,以下是配置的例子:
LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=YLQ)(PORT=1521))
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=GCSQL2000)
(ORACLE_HOME=C:ORACLEORA81)
(PROGRAM=HSOLESQL)
)
(SID_DESC=
(SID_NAME=TGSQL2000)
(ORACLE_HOME=C:ORACLEORA81)
(PROGRAM=TG4MSQL)
)
)
记住要使你的配置立即生效,必须重新启动监听器
4. 创建数据库连接(DATABASE LINK)
创建异类服务数据库连接和创建普通的数据库连接没有任何区别,这里我就不想赘述了,详细请参考<>
5. 测试数据库连接
查询数据
SELECT * FROM “dbo”.”SYS_DB_INFO”@MSOLEDB;
创建同义词
CREATE SYNONYM L_SYS_DB_INFO FOR “dbo”.”SYS_DB_INFO”@MSOLEDB;
执行存储过程
exec check_money@TGSQLSERVER(par1,par2)
利用DBMS_HS_PASSTHROUGH包直接发送SQL.

数据库迁移

数据库迁移就包括两种,一种就是数据库脚本,一种就是数据库中的数据.
脚本迁移,可能就要了解源,目标的结构. 这个最好写一个规范文档.
至于数据迁移,那么就可以用数据库本身的功能: 复制+订阅 或者 存储过程+job (但建议用程序+数据库方法,程序不停调度,某一家公司的数据就是这么同步的.)

第一章 数据迁移基础
在信息共享日益普遍的情况下,各行各业都在进行着企业信息化建设,为了节约信息建设的费用,大都从现有的系统进行扩充或升级,ERP之路任重而道远,一般情况下,企业往往有大量的重要数据要迁移到新系统中去。
数据迁移是一项繁锁而又单调的工作,面对各种各样的基础数据,定制开发数据迁移工具往往费时费力,切不通用,那么到底什么工具能够胜任我们的工作呢?MS DTS可以将各种各样的数据源导入到各种各样的数据库,易学易用,在异构数据转换过程中,LOB(TXTT、IMAGE)字段的转换是容易失败的地方。

图1.1 字段合并
MS DTS在数据转换方面简单易学,功能强大,不仅可以使用VBSCRIPT与JSCRIPT脚本进行数据合并、分解、转换、汇总,还可以用PACKAGE的方式将转换过程存储在服务器上,通过代理服务多次/定时/调度地执行。

图1.2 异构数据

图1.3 脚本编写
MSDTS承袭了MS的易学易用的优良传统,对使用者的要求很低,经过短时间培训,一般文员都可以使用MS DTS导入导出数据啦。

图1.4 调度计划
第二章 异构数据迁移
很多时间,要在异构数据库之间进行数据迁移或抽取,如果在MS SQL SERVER中提取ORACLE的数据,可以通过ODBC、OLEDB等多种方式,要从ORACLE提取SQL中的数据,大都是通过透明网关来实现的。
在异构数据抽取过程中,最好采用SQL92标准的语法编写SQL代码,同时要注意不同数据库之间数据类型的转换关系,如ORACLE的日期类型用 DATE、MS SQLSERVER的日期类型用DateTime等。在Excel导入到MS SQLSERVER或ORACLE时,还要注意数字串的字段往往被目的数据库隐式转换成数字型的字段。

一 关于ORACLE的透明网关配置(FOR MS SQL SERVER)
ORACLE安装时(9i),将TRANSPARENT GATEWAY FOR MSSQL选中,在ORACLE主目录\BIN中,有个tg4msql.exe程序,它就是透明网关程序,同时在主目录中还有tgrmsql的这个目 录,ORACLE_HOME$\tg4msql\admin目录中的inittg4msql.ora文件,必须手工进行配置才能在ORACLE中连接MS SQL SERVER。

图2.1 tg4msql
1 如何配置透明网关呢?打开inittg4msql.ora:
#
# HS init parameters
# xzh代表MS SQLSERVER服务名,pubs代表要访问的MS SQLSERVER数据库
#
HS_FDS_CONNECT_INFO="SERVER=xzh;DATABASE=pubs"
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
2 监听的配置oracle_home\network\admin\Listiner.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))
)
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))
)
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = xzh.world)
(ORACLE_HOME = D:\oracle\ora92)
(SID_NAME = xzh)
)
(SID_DESC =
(GLOBAL_DBNAME =MySQL)
(PROGRAM = tg4msql)
(SID_NAME = MySQL)
(ORACLE_HOME = D:\oracle\ora92)
)
)
加亮部分代码是要在监听文件中手工添加,GLOBAL_DBNAME、SID_NAME可以任意指定,PROGRM必须指向tg4msql 如图2.1所示。
3 本地服务文件的配置oracle_home\network\admin\TnsNames.ora
XZH =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xzh.world)
)
)

TG4MSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xzh)(PORT = 1527))
)
(CONNECT_DATA =
(SID =MySQL)
)
(HS = OK)
)
上例中MS SQL SERVER的本地服务名指定为TG4MSQL,可以任意写,SID必须是Listiner.ora中指定的那个SID_NAME,PORT也必须是监听 中指定的PORT,主机等都要符合一致。到此为止,我们把透明网关大致已经配置好啦,如果要访问MS SQL SERVER数据库,还要在ORACLE中创建数据库链才行。
4 在MS SQLSERVER中创建登录帐号xzh口令xzh,授权使之可以访问PUBS数据库。
SQL>CREATE DATABASE LINK FROM_SQL CONNECT TO xzh IDENTIFIED BY xzh USING ‘TG4MSQL’
USING ‘TG4MSQL’中的 ‘TG4MSQL’是tnsnames.ora中配置好的指定MS SQL SERVER服务器的可以被ORACLE访问的本地服务名,FROM_SQL是我们以后要引用的数据库链名,切记MS SQL SERVER中的登录帐号(xzh/xzh)必须符合ORACLE的帐号规范,如果用(xzh/0000)就会在创建数据库链路时失败。
SQL>SELECT * FROM sales@FROM_SQL
如果有数据返回,表示我们访问SQL数据库的通道已经建成,请大胆使用吧,但对远程异构数据库不充许进行DDL操作。
SQL>CREATE TABLE all_users@TG4MSQL FROM all_users;
ERROR 位于第 1 行:
ORA-02021: 不允许对远程数据库进行 DDL 操作

二 MS SQL SERVER访问ORACLE的方法
1 通过行集函数OPENDATASOURCE
SELECT * FROM OPENDATASOURCE( 'MSDAORA',
'Data Source=xzh.oracle;User ID=POS;Password=POS')..POS.A0325
MSDAORA是OLEDB FOR ORACLE的驱动,初始化字符串中必须提供要访问的ORACLE本地服务名、用户名、口令。然后引用表中数据时要以服务器..用户名.表名的格式。注意 一定是四部分组成,用户名与表名一定要大写,服务器与用户名之间是两个点号。
SELECT * INTO PUBS.DBO.A0325 FROM
OPENDATASOURCE( 'MSDAORA',
'Data Source=UITE;User ID=POS;Password=POS' )..POS.A0325
说明:将ORACLE服务器UITE中POS模式的A0325导入到MS SQLSERVER的PUBS数据库,注意A0325在这条语气执行时被创建,如果A0325已经存在PUBS数据库中,可以使用INSERT INTO的语法导入数据
INSERT INTO PUBS.DBO.A0325 FROM
OPENDATASOURCE( 'MSDAORA',
'Data Source=UITE;User ID=POS;Password=POS' )..POS.A0325
2 通过MS SQLSERVER的链接服务器访问ORACLE的数据
--在查询分析器中查看已经存在的链接服务器
SELECT*FROM SYSSERVERS
--添加链接服务器ORCL到MS SQL SERVER,也可以在企业管理器中创建
EXEC SP_ADDLINKEDSERVER
@server = 'ORCL', --ORCL是SQL中链接服务器名称
@srvproduct = 'Oracle',        --Oracle 固定的            
@provider = 'MSDAORA', --MSDAORA 固定的
@datasrc = 'UITE' --DataSrc 本地服务名

EXEC SP_DROPSERVER ‘ORCL’ --删除链接服务器

在这里声明一下,如果现在就访问ORACLE肯定不能,因为没有提供登录ORACLE的用户名/口令
EXEC SP_ADDLINKEDSRVLOGIN 'ORCL', false, 'sa', 'POS', 'POS'
SA是MS SQLSERVER的登录帐号,POS/POS是ORACLE的登录帐号。
SELECT * FROM ORCL..POS.A0325
FROM后面必须是四部分组成。为什么执行后报错呢,本人一直在寻找解决办法,最后发现通过T-SQL语句没法解决,只有打开MS SQLSERVER的企业管理器。

图2.2 配置ORACLE的远程帐号

图2.3设置远程登录帐号
SELECT * FROM ORCL..POS.A0325
通过图2.2、2.3以后,在查询分析器执行时,立即从ORACLE的ORCL服务器上POS模式的A0325表中查到数据,注意在图2.3步操作过程 中,必须在安全性页面选中“用此安全上下文进行”的复选项,然后在“远程登录/使用密码”所对应的文本中输入ORCL服务器上有登录权限的帐号。
SELECT * FROM OPENQUERY(ORCL, 'SELECT * FROM POS.A0325')
3 使用MS SQL SERVER的OPENROWSET函数
SELECT A.*
FROM OPENROWSET('MSDAORA',
'UITE';'POS';'POS', POS.A0325) AS A ORDER BY A.ID
说明:有些地方使用行集函数要用别名才能引用,请大家注意。
4使用ODBC的方式
SELECT A.*
FROM OPENROWSET('MSDASQL','ORCL_ODBC';'POS';'POS',
POS.A0325) AS A ORDER BY A.ID
说明:ORCL_ODBC是访问ORACLE 服务器UITE的ODBC数据源,以上所有代码在SQL QUERY ANALYZE 中通过。关于MS SQL SERVER访问ORACLE有四种方式,其中通过ODBC与链接服务器的方式做起来难度较大,对于初学者会复杂一些,使用OLE DB FOR ORACLE的驱动时,有OPENDATASOURCE与OPENROWSET函数可以使用,都很方便,笔记喜欢使用后者,交待一下,在数据存取方 面,OLE DB效率较ODBC为佳。

--这个是在sql里面查询oracle的数据,按照这些方法,你可以使用SQL的导入导出功能将数据导到oracle里面.

SQL和ORACLE之间的数据查询

配置透明网关的步骤


前一段花了些时间配置 TRANSPARENT GATEWAY
现在把心得贴出来与大家共享

我的OS是WIN2000
ORACLE 9.0
SQLSERVER2000
HOSTNAME : SVR1
都使用 tcp/ip 默认端口


1: 安装 TRANSPARENT GATEWAY 选件(我安装的是FOR MSSQL)
安装完成了以后有这样一个目录 oracle_home\ora90\tg4msql

2: 配置 LISTENER.ORA
(SID_DESC =
(GLOBAL_DBNAME = tg4sql) # 可自己命名
(PROGRAM = tg4msql)
(SID_NAME = sql2000) # SID 自己命名
(ORACLE_HOME = D:\oracle\ora90)
)

3: 在 oracle_home\ora90\tg4msql\admin
建文件 init .ora 由于LISTENER里定义SID为 sql2000
因此文件名为:initsql2000.ora
其中内容为:
HS_FDS_CONNECT_INFO=svr1.master # svr1为SQL服务器名
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER

4: 重启 DATABASE AND LISTENER

5: 配置 tnsnames.ora
tg_sql =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = SVR1)(PORT = 1521))
)
(CONNECT_DATA =
(SID = sql2000)
)
(HS=OK)
)

6: 建立 DATABASE LINK
CREATE PUBLIC DATABASE LINK DB_SQL
CONNECT TO SA IDENTIFIED BY PASSWORD
USING 'tg_sql'

7: 完成,测试
select * from t_test@db_sql

8: 请注意使用 DBLINK 时,INIT.ORA中 GLOBAL_NAME 的设置,
如果为 ture , 请使用DBLINK的全称,可在 all_db_links 中查到,
如果为 FALSE, 不必使用全称,当出现
“ORA-02019:为找到远程数据库的连接说明”
时,请使用全称,如:
select * from t_test@db_sql.US.ORACLE.COM

2009/02/24

Oracle Form中调用并发请求生成报表并输出为PDF的方法

摘自:網路

Form 中调用并发请求生成报表并输出PDF的方法。
要完成这个目的,首先要在ebs中注册报表,并注册模板。
然后再方法里先调用FND_REQUEST.ADD_LAYOUT添加模板,然后调用FND_REQUEST.SUBMIT_REQUEST提交并发请求,再调用FND_CONCURRENT.WAIT_FOR_REQUEST等待请求完成并返回分析,状态和完成信息。
procedure print_report(order_number in NUMBER,date_from in date,date_to in date) is
L_REQUEST_ID NUMBER;
L_BL_RESULT BOOLEAN;
v_layout BOOLEAN;
X_PHASE VARCHAR2(100);
X_STATUS VARCHAR2(100);
X_DEV_PHASE VARCHAR2(100);
X_DEV_STATUS VARCHAR2(100);
X_MESSAGE VARCHAR2(100);
BEGIN
/*
--
-- Name
-- add_layout
-- Purpose
-- Called before submission to add layout options for request output.
--
-- Arguments
-- Template_APPL_Name - Template Application Short name.
-- Template_code - Template code
-- Template_Language - Template File language (iso value)
-- Template_Territory - Template File Territory (iso value)
-- Output Format - Output Format
--添加输出模板,FND_REQUEST.add_layout (template_appl_name in varchar2,
template_code in varchar2,
template_language in varchar2,
template_territory in varchar2,
output_format in varchar2) return boolean
*/

v_layout:=FND_REQUEST.ADD_LAYOUT('PO',
'TRNORDER094',
Null,
Null,
'PDF');

/*
--
-- Name
-- submit_request
-- Purpose
-- Submits concurrent request to be processed by a concurrent manager
--
-- Arguments
-- application - Short name of application under which the program
-- - is registered
-- program - concurrent program name for which the request has
-- - to be submitted
-- description - Optional. Will be displayed along with user
-- - concurrent program name
-- start_time - Optional. Time at which the request has to start
-- - running
-- sub_request - Optional. Set to TRUE if the request is submitted
-- - from another running request and has to be treated
-- - as a sub request. Default is FALSE
-- argument1..100 - Optional. Arguments for the concurrent request
-- 提交并发请求
--FND_REQUEST.SUBMIT_REQUEST(application IN varchar2 default NULL,
program IN varchar2 default NULL,
description IN varchar2 default NULL,
start_time IN varchar2 default NULL,
sub_request IN boolean default FALSE
argument1,
argument2, ..., argument99,
argument100) return number;
*/

L_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST('PO',
'TRNORDER094',
'',
'',
FALSE,
order_number,
date_from,
date_to,
CHR(0),'','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','',
'','','','','','','','','','');

COMMIT;
IF L_REQUEST_ID IS NULL OR L_REQUEST_ID = 0 THEN
RETURN;
END IF;

/*
--
-- Name
-- WAIT_FOR_REQUEST
-- Purpose
-- Waits for the request completion, returns phase/status and
-- completion text to the caller. Calls sleep between db checks.
-- Arguments (input)
-- request_id - Request ID to wait on
-- interval - time b/w checks. Number of seconds to sleep
-- - (default 60 seconds)
-- max_wait - Max amount of time to wait (in seconds)
-- - for request's completion
-- Arguments (output)
-- User version of phase and status
-- Developer version of phase and status
-- Completion text if any
-- phase - Request phase ( from meaning in fnd_lookups )
-- status - Request status( for display purposes )
-- dev_phase - Request phase as a constant string so that it
-- - can be used for comparisons )
-- dev_status - Request status as a constatnt string
-- message - Completion message if request has completed
--
--等待并发请求完成,并返回分析/状态和完成信息,FND_CONCURRENT.WAIT_FOR_REQUEST(request_id IN number default NULL,
interval IN number default 60,
max_wait IN number default 0,
phase OUT varchar2,
status OUT varchar2,
dev_phase OUT varchar2,
dev_status OUT varchar2,
message OUT varchar2) return boolean;
*/


L_BL_RESULT := FND_CONCURRENT.WAIT_FOR_REQUEST(L_REQUEST_ID,
1,
0,
X_PHASE,
X_STATUS,
X_DEV_PHASE,
X_DEV_STATUS,
X_MESSAGE);
IF X_DEV_PHASE = 'COMPLETE' AND X_DEV_STATUS = 'NORMAL' THEN
editor_pkg.report(L_REQUEST_ID,'Y'); --使输出的报表pdf文件在浏览器中显示。
ELSE
fnd_file.put_line(1,RPAD('x_phase',20,' ') || '=' || X_PHASE);
fnd_file.put_line(1,RPAD('x_status=',20,' ') || '=' || X_STATUS);
fnd_file.put_line(1,RPAD('x_dev_phase=', 20, ' ') || '=' || X_DEV_PHASE);
fnd_file.put_line(1,RPAD('x_dev_status=',20,' ') || '=' || X_DEV_STATUS);
fnd_file.put_line(1,RPAD('x_message=',20,' ') || '=' || X_MESSAGE);
fnd_file.put_line(1,'Warning : Starting journal print report failure! It did not running in 120 seconds, its request_id is ' ||
TO_CHAR(L_REQUEST_ID) || ' please check it.');
END IF;
end print_report;

Lotus Symphony 1.2 辦公室軟體免費下載

Lotus Symphony 1.2 辦公室軟體免費下載(內含安裝程式、安裝說明、軟體合約)



IBM Lotus Symphony 1 for Windows
版本: 1.2
支援語言: 繁體中文
更新日期: 2008/11/03
系統需求: Windows XP, Windows Vista

請下載下面檔案,然後遵照 'IBM Lotus Symphony Installation Guide' 裡的步驟安裝。

Lotus Symphony Setup for Windows

Lotus Symphony Setup for Linux