PostRank

2009/03/06

历史数据归档(转)


在实际业务中,累计5年的历史业务数据可能比较大,比如可能超过1T的数据,这时可能就会影响业务处理
OLTP的运行效率,一般是将5年以上的数据归档的其他地方,同时从当前业务系统中删除。

有各位哥们对这个过程比较熟悉,ORACLE ERP时什么策略呢? 请高手指点。
DBX archiver的功能就是把历史数据放在另一个数据库中,如果在prod中的查询涉及到历史数据,就会到历史库中取数据,实现对客户的透明化,而数据是在两个独立的数据库中存放

类似的ORACLE数据归档的方案应该有不少,但说实话没有一家特别优秀的,因为ORACLE EBS涉及到的业务表太多,数据之间千丝万缕,不是简单的把某些schema的表里的数据移走了事

archive的原理说起来简单,具体实现起来哪些数据走,哪些数据留,那些是事务,哪些不算,没几个人会深入下去搞懂它们。oracle本身提供了 archive的接口,也实现了全部的业务逻辑,但它自己也知道这块做的很烂,所以它从来不愿意公开,更没有全面的推广,只是告诉用户有这么一个接口存在 而已。想自己利用ORACLE的接口,几乎就是一个字:死。。。。

所以才有了大大小小第三方公司的各种解决方案,Outerbay应该算其中不错的一家吧

我曾经为某家大公司,专门负责做个data archive的归档项目,研究它的archive规则,天天和一群印度人做这个,头都太大了。我从进那个项目开始做这个,一直到我走,还没有结束UAT 状态,没办法,数据实在太重要了,有这个需求的肯定都是大公司,数据就是它的命,要它把自己的命都移走,不谨慎那是不可能。。。。

outerbay对EBS的方案也和EMC的类似,把要归档的那些历史数据,整体移到另一个数据库里去,原数据库里数据少了,查询起来当然快

以AP为例,
分别建2类职责:
1个是普通AP查询,专门查近期的数据,比如2000年以后的数据,速度很快
1个是所有AP查询,数据来自一个union的view,速度肯定快不了,这种需求不如1多

发票归档不?没付款的发票归档不?N年前的发票N年后付款归档不?AR的,GL的,PO的,OM的,CE的,,,,,头都大了,最后我把文档,资 料,test case,test document,统统归档后,bye-bye了。。。不是人做的事情,谁做谁要吐。。。。。。。。。
SAP用户R/3文档归档解决方案

业务问题描述:对于使用SAP系统的客户来说,归档SAP系统的数据和对象已经变得越来越重要。 SAP用户通常是在系统越来越不行的时候才想到归档数据和对象的需要,SAP系统通常会变得越来越慢和用户响应时间越来越长,SAP用户也需要能快速访问SAP相关的文档。
客户需求表现:
- 你现在的SAP系统的数据库有多大?
- 每个月数据库的增长有多快?
- 你有发现用户响应时间或SAP系统的性能有下降吗?
- 你希望能通过SAP图形界面来归档和查看打印列表、发票、凭证、图像等吗?
- 你的用户是否希望将一些非SAP的对象,例如Word文档、Excel表格,电子 邮
- 件或视频片断和SAP的交易进行关联,并且能通过SAP系统来进行查看?

解决方案描述: IBM的 Content Manager CommonStore 解决方案已经通过了SAP的Archivelink接口的认证。CommonStore能运行在UNIX, AIX, NT 和 AS/400 平台上,同时也提供了方法来归档不活动的数据库数据,打印列表,发票,影像和另外的和SAP交易相关的文档。SAP用户能直接通过SAP的图形界面来访问 这些文档,并且能查询活动和不活动的数据库数据。客户也能增加另外的IBM Content Manager 应用,例如如果他们需要归档SAP系统以外的内容,可以使用CM或CM Ondemand。
- 带来的好处:
1.开始对SAP系统进行归档,减轻SAP生产系统的压力。
2.通过SAP图形界面归档和提取相关的文档。
3.用户能以浏览器的方式访问SAP系统信息。
- 典型应用:
1.使用SAP R3系统的用户。
- 典型用户:
1.海尔电器
2.长虹电器
案例介绍
CommonStore for SAP R/3在四川长虹的实施案例
系统需求及应用背景
四川长虹电子集团公司是我国大型国有独资公司,始建于1958年,目前拥有多个事业部,包括南通长虹、吉林长虹等多家控股、参股公司,现有员工3万多人, 同时,也拥有覆盖全国各地的一万多个营销服务网点,具有强大的营销实力,产品畅销美洲、澳洲、东南亚、中亚等国家和地区,在海外享有盛誉,为中国家电行业 第一品牌。
长虹公司的SAP R/3系统为4.5b中文版、从2000年9月开始上线,数据库DB2 V5.2.使用了MM、SD、FI、SM四个模块。从系统投入运行以来,在线数据库急剧膨胀,系统数据库是以每周4G的速度增长,数据库2001年5月容 量已经达到110GB,磁盘系统仅有22GB空余空间可以使用。磁盘空间不足的问题非常明显,严重影响了数据库的性能,并增加了R/3用户的等待时间,降 低了R/3系统的效率。同时增加了系统管理的复杂程度,备份时间的大大增加。另外购买高端磁盘系统的需求递增。
解决方案
长虹公司对于上述问题所采取的解决方案为:
- IBM CommonStore for SAP R/3 +TSM+3575磁带库
- 使用IBM CommonStore for SAP R/3 通过TSM将R/3数据库中的数据归档到3575磁带库中的磁带。
这个方案充分利用已有的软件和硬件资源:
- 软件: Tivoli Storage Management。
- 硬件: 3575 磁带库、RS/6000 S7a服务器。
- 新增软件: IBM CommonStore for SAP
实施后的效果
系统实施后的归档数据范围从2001年7月到2001年12月,业务数据量达35G,归档后腾出数据28.7G。总结来说有以下几点:
- 系统实施完成后,数据库的大小明显减少了,高速的数据增长得到有效控制,SAP R/3系统的运行效率提高了。
- 已经购买的备份系统与新系统无缝集成,数据备份与归档更趋完善。
- 已有硬件和软件投资得到保护。

http://www-01.ibm.com/software/cn/data/solution/db2_content_solution02.html

2009/03/05

接口表GL_INTERFACE中的字段STATUS表示的含义

摘自:網路

在从AP导入GL的过程中,导入到接口表GL_INTERFACE中的数据,在字段STATUS中出现了'EF05' 'P'等错误状态。
其中的'P状态不是错误的状态,是由于同一个组标示的其他的数据出现了问题。
出现的错误状态可能有:
期间错误代码
------------------
EP01 此日期不在任何打开的或将来可输入的期间内。
EP02 这个帐套没有任何已打开的或将来可输入的会计期
EP03 此日期不在打开保留年度的任何期间内。
EP04 此日期不是一个业务日。
EP05 在此会计期中不存在业务日。
不平衡的日记帐错误代码
------------------------------
WU01 警告:此日记帐分录不平衡。之所以被接受是因为在该帐套中允许暂记过帐。
EU02 此日记帐分录不平衡,并且在此帐套中不允许暂记过帐。
EU03 此保留款日记帐分录不平衡,并且未定义“保留款准备金”帐户。

弹性域错误代码
---------------------
EF01 此会计日期的会计科目弹性域不活动。
EF02 此会计科目弹性域不允许明细过帐。
EF03 “不可用的会计科目编码”
EF04 这是无效的会计科目弹性域。检查您的交叉验证规则和段值。
EF05 不存在具有此代码组合标识的会计科目弹性域。
外币错误代码
----------------------------
EC01 您必须对“用户”的一个currency_conversion_type提供一个currency_conversion_rate
EC02 未提供折换日期。
EC03 在输入外币日记帐分录行时,必须提供折换率类型或入帐金额。
EC06 此币种、折换类型和折换日期不存在折换率。
EC08 币种代码无效。
EC09 未启用任何币种。
EC10 不能创建外币保留款日记帐。
EC11 折换率类型无效。
EC12 在本位币或 STAT 币种日记帐行中,输入金额必须等于入帐金额。
EC13 金额太大。
ECW1 警告:由于未指定折换率类型,因此无法验证折换额。
预算错误代码
-----------------
EB01 必须为预算行提供预算版本。
EB02 不能为冻结预算创建日记帐。
EB03 预算年度未打开。
EB04 该帐套不存在此预算。
EB05 预算日记帐的 encumbrance_type_id 列必须为 NULL。
EB06 必须为预算日记帐提供期间名称。
EB07 此期间名称无效,请检查日历以便查找有效的期间。
EB08 不能为预算创建平均日记帐。^
EB09 不能为预算指定来源公司信息。

保留款错误代码

EE01 必须为保留款行提供保留款类型。
EE02 保留款类型无效或被禁用。
EE03 不能创建 STAT 币种的保留款日记帐。
EE04 保留款行的 BUDGET_VERSION_ID 列必须为 NULL。
EE05 不能为保留款创建平均日记帐。
EE06 不能为保留款指定来源公司信息。
冲销错误代码
ER01 必须提供冲销期间名称。
ER02 此冲销期间名称无效,请检查日历以便查找有效的期间。
ER03 必须提供冲销日期。
ER04 此冲销日期不在有效的期间内。
ER05 此冲销日期不是数据库日期格式。
ER06 冲销日期必须与有效日期相同或在有效日期之后。
ER07 此冲销日期不是一个业务日。
ER08 在冲销期间内中没有业务日。
ER09 未确定默认冲销信息。

说明性弹性域错误代码
---------------------------------
内容和属性值没有形成一个有效的对日记帐的说明性弹性域 - “日记帐分录行”。
ED02 前后关联值和属性值没有对日记帐形成一个有效的说明性弹性域
ED03 对于增值税,上下文和属性值没有形成有效的的说明性弹性域。
其它错误代码
-------------------------
EM01 日记帐分录类别无效。
EM02 未定义任何日记帐分录类别。
EM03 无效的 set_of_books_id.
EM04 无效 “actual flag”: 必须是 "A" (实际), "B" (预算) 或 "E" (保留款)
EM05 实际日记帐的 encumbrance_type_id 列必须为 NULL。
EM06 实际日记帐的 budget_version_id 列必须为 NULL。
EM07 在输入 STAT 币种日记帐行时,统计额属于 entered_dr(cr) 列。
EM09 未定义事务处理代码
EM10 事务处理代码无效。
EM12 生成序列编号时出现 Oracle 错误。
EM13 分配的序号不活动。
EM14 由于缺少授权或同义词,因此产生了序列编号设置错误。
EM17 序列编号经常被使用,但此帐套和日记帐分录类别不存在分配。
EM18 人工单据序号不能与“日记帐导入”一起使用。
EM19 增值税数据仅在与实际日记帐结合时才有效。
EM21 “预算控制”必须能够引入该批
EM22 为这会计日期, 您的缺省折换率类型, 以及您的双重币种必须定义一折换率
EM23 对“双重币种缺省率类型”配置文件选项没有输入值
EM24 只能将平均日记帐导入到合并帐套中。)
EM25 平均日记帐标志无效。有效值为 "Y"、"N" 和 NULL。
EM26 来源公司无效。
EM27 只有在启用公司间平衡后,才能指定来源公司信息。

Period Error Codes
------------------
EP01 This date is not in any open or future enterable period.
EP02 This set of books does not have any open or future enterable periods.
EP03 This date is not within any period in an open encumbrance year.
EP04 This date is not a business day.
EP05 There are no business days in this period.

Unbalanced Journal Error Codes
------------------------------
WU01 Warning: This journal entry is unbalanced. It is accepted because suspense posting is allowed in this set of books.
EU02 This journal entry is unbalanced and suspense posting is not allowed in this set of books.
EU03 This encumbrance journal entry is unbalanced and the Reserve for Encumbrance account is not defined.

Flexfield Error Codes
---------------------
EF01 This Accounting Flexfield is inactive for this accounting date.
EF02 Detail posting not allowed for this Accounting Flexfield.
EF03 Disabled Accounting Flexfield.

Amertron PH SOB Journal Import Execution Report Date: 17-JUL-08 14:26
Concurrent Request ID: 4934435 Page: 2

========================================================== Error Key ======================================

Flexfield Error Codes
---------------------
EF04 This is an invalid Accounting Flexfield. Check your cross-validation rules and segment values.
EF05 There is no Accounting Flexfield with this Code Combination ID.

Foreign Currency Error Codes
----------------------------
EC01 A conversion rate must be entered when using the User conversion rate type.
EC02 There is no conversion date supplied.
EC03 A conversion rate type or an accounted amount must be supplied when entering foreign currency journal lines.
EC06 There is no conversion rate for this currency, conversion type, and conversion date.
EC08 Invalid currency code.
EC09 No currencies are enabled.
EC10 Encumbrance journals cannot be created in a foreign currency.
EC11 Invalid conversion rate type.
EC12 The entered amount must equal the accounted amount in a functional or STAT currency journal line.
EC13 Amount is too large.
ECW1 Warning: Converted amounts could not be validated because the conversion rate type is not specified.

Budget Error Codes
------------------
EB01 A budget version is required for budget lines.
EB02 Journals cannot be created for a frozen budget.
EB03 The budget year is not open.
EB04 This budget does not exist for this set of books.
EB05 The encumbrance_type_id column must be null for budget journals.
EB06 A period name is required for budget journals.
EB07 This period name is not valid. Check calendar for valid periods.
EB08 Average journals cannot be created for budgets.
EB09 Originating company information cannot be specified for budgets.

Encumbrance Error Codes
-----------------------
EE01 An encumbrance type is required for encumbrance lines.
EE02 Invalid or disabled encumbrance type.
EE03 Encumbrance journals cannot be created in the STAT currency.
EE04 The BUDGET_VERSION_ID column must be null for encumbrance lines.
EE05 Average journals cannot be created for encumbrances.
EE06 Originating company information cannot be specified for encumbrances.

Reversal Error Codes
--------------------
ER01 A reversal period name must be provided.
ER02 This reversal period name is invalid. Check your calendar for valid periods.
ER03 A reversal date must be provided
ER04 This reversal date is not in a valid period.
ER05 This reversal date is not in your database date format.
ER06 Your reversal date must be the same as or after your effective date.
ER07 This reversal date is not a business day.
ER08 There are no business days in your reversal period.
ER09 Default reversal information could not be determined.

Amertron PH SOB Journal Import Execution Report Date: 17-JUL-08 14:26
Concurrent Request ID: 4934435 Page: 3

========================================================== Error Key =======================================

Descriptive Flexfield Error Codes
---------------------------------
ED01 The context and attribute values do not form a valid descriptive flexfield for Journals - Journal Entry Lines.
ED02 The context and attribute values do not form a valid descriptive flexfield for Journals - Captured Information.
ED03 The context and attribute values do not form a valid descriptive flexfield for Value Added Tax.

Miscellaneous Error Codes
-------------------------
EM01 Invalid journal entry category.
EM02 There are no journal entry categories defined.
EM03 Invalid set of books id.
EM04 The value in the ACTUAL_FLAG must be "A" (actuals), "B" (budgets), or "E" (encumbrances).
EM05 The encumbrance_type_id column must be null for actual journals.
EM06 The budget_version_id column must be null for actual journals.
EM07 A statistical amount belongs in the entered_dr(cr) column when entering a STAT currency journal line.
EM09 There is no Transaction Code defined.
EM10 Invalid Transaction Code.
EM12 An Oracle error occurred when generating sequential numbering.
EM13 The assigned sequence is inactive.
EM14 There is a sequential numbering setup error resulting from a missing grant or synonym.
EM17 Sequential numbering is always used and there is no assignment for this set of books and journal entry category.
EM18 Manual document sequences cannot be used with Journal Import.
EM19 Value Added Tax data is only valid in conjunction with actual journals.
EM21 Budgetary Control must be enabled to import this batch.
EM22 A conversion rate must be defined for this accounting date, your default conversion rate type, and your dual currency.
EM23 There is no value entered for the Dual Currency Default Rate Type profile option.
EM24 Average journals can only be imported into consolidation sets of books.
EM25 Invalid average journal flag. Valid values are "Y", "N", and null.
EM26 Invalid originating company.
EM27 Originating company information can only be specified when intercompany balancing is enabled.

2009/03/04

Oracle中的exception

摘自:網路

  1、异常的优点
  
  如果没有异常,在程序中,应当检查每个命令的成功还是失败,如
  BEGIN
  SELECT ...
  -- check for ’no data found’ error
  SELECT ...
  -- check for ’no data found’ error
  SELECT ...
  -- check for ’no data found’ error
  这种实现的方法缺点在于错误处理没有与正常处理分开,可读性差,使用异常,可以方便处理错误,而且异常处理程序与正常的事务逻辑分开,提高了可读性,如
  BEGIN
  SELECT ...
  SELECT ...
  SELECT ...
  ...
  EXCEPTION
  WHEN NO_DATA_FOUND THEN -- catches all ’no data found’ errors
  
  2、异常的分类
  
  有两种类型的异常,一种为内部异常,一种为用户自定义异常,内部异常是执行期间返回到PL/SQL块的ORACLE错误或由PL/SQL代码的某操作引起的错误,如除数为零或内存溢出的情况。用户自定义异常由开发者显示定义,在PL/SQL块中传递信息以控制对于应用的错误处理。
  
  每当PL/SQL违背了ORACLE原则或超越了系统依赖的原则就会隐式的产生内部异常。因为每个ORACLE错误都有一个号码并且在PL/SQL中异常通过名字处理,ORACLE提供了预定义的内部异常。如SELECT INTO 语句不返回行时产生的ORACLE异常NO_DATA_FOUND。对于预定义异常,现将最常用的异常列举如下:
  exception  oracle error  sqlcode value  condition
  no_data_found              ora-01403  +100  select into 语句没有符合条件的记录返回
  too_many_rows  ora-01422  -1422  select into 语句符合条件的记录有多条返回
  dup_val_on_index  ora-00001  -1  对于数据库表中的某一列,该列已经被限制为唯一索引,程序试图存储两个重复的值
  value_error  ora-06502  -6502  在转换字符类型,截取或长度受限时,会发生该异常,如一个字符分配给一个变量,而该变量声明的长度比该字符短,就会引发该异常
  storage_error  ora-06500  -6500  内存溢出
  zero_divide  ora-01476  -1476  除数为零
  case_not_found  ora-06592  -6530  对于选择case语句,没有与之相匹配的条件,同时,也没有else语句捕获其他的条件
  cursor_already_open  ora-06511  -6511  程序试图打开一个已经打开的游标
  timeout_on_resource  ora-00051  -51  系统在等待某一资源,时间超时
  
  如果要处理未命名的内部异常,必须使用OTHERS异常处理器或PRAGMA EXCEPTION_INIT 。PRAGMA由编译器控制,或者是对于编译器的注释。PRAGMA在编译时处理,而不是在运行时处理。EXCEPTION_INIT告诉编译器将异常名与ORACLE错误码结合起来,这样可以通过名字引用任意的内部异常,并且可以通过名字为异常编写一适当的异常处理器。
  
  在子程序中使用EXCEPTION_INIT的语法如下:
  PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);
  
  在该语法中,异常名是声明的异常,下例是其用法:
  DECLARE
  deadlock_detected EXCEPTION;
  PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
  BEGIN
  ... -- Some operation that causes an ORA-00060 error
  EXCEPTION
  WHEN deadlock_detected THEN
  -- handle the error
  END;
  
  对于用户自定义异常,只能在PL/SQL块中的声明部分声明异常,异常的名字由EXCEPTION关键字引入:
  reserved_loaned Exception
  
  产生异常后,控制传给了子程序的异常部分,将异常转向各自异常控制块,必须在代码中使用如下的结构处理错误:
  Exception
  When exception1 then
  Sequence of statements;
  When exception2 then
  Sequence of statements;
  When others then
  
  3、异常的抛出
  
  由三种方式抛出异常
  
  1. 通过PL/SQL运行时引擎
  
  2. 使用RAISE语句
  
  3. 调用RAISE_APPLICATION_ERROR存储过程
  
  当数据库或PL/SQL在运行时发生错误时,一个异常被PL/SQL运行时引擎自动抛出。异常也可以通过RAISE语句抛出
  RAISE exception_name;
  
  显式抛出异常是程序员处理声明的异常的习惯用法,但RAISE不限于声明了的异常,它可以抛出任何任何异常。例如,你希望用TIMEOUT_ON_RESOURCE错误检测新的运行时异常处理器,你只需简单的在程序中使用下面的语句:
  RAISE TIMEOUT_ON_RESOUCE;
  
  比如下面一个订单输入的例子,若当订单小于库存数量,则抛出异常,并且捕获该异常,处理异常
  DECLARE
  inventory_too_low EXCEPTION;
  
  ---其他声明语句
  BEGIN
  IF order_rec.qty>inventory_rec.qty THEN
  RAISE inventory_too_low;
  END IF
  EXCEPTION
  WHEN inventory_too_low THEN
  order_rec.staus:='backordered';
  END;
  
  RAISE_APPLICATION_ERROR内建函数用于抛出一个异常并给异常赋予一个错误号以及错误信息。自定义异常的缺省错误号是+1,缺省 信息是User_Defined_Exception。RAISE_APPLICATION_ERROR函数能够在pl/sql程序块的执行部分和异常部 分调用,显式抛出带特殊错误号的命名异常。  Raise_application_error(error_number,message[,true,false]))
  
  错误号的范围是-20,000到-20,999。错误信息是文本字符串,最多为2048字节。TRUE和FALSE表示是添加(TRUE)进错误堆(ERROR STACK)还是覆盖(overwrite)错误堆(FALSE)。缺省情况下是FALSE。
  
  如下代码所示:
  IF product_not_found THEN
  RAISE_APPLICATION_ERROR(-20123,'Invald product code' TRUE);
  END IF;
  
  4、异常的处理
  
  PL/SQL程序块的异常部分包含了程序处理错误的代码,当异常被抛出时,一个异常陷阱就自动发生,程序控制离开执行部分转入异常部分,一旦程序进入异常部分就不能再回到同一块的执行部分。下面是异常部分的一般语法:
  EXCEPTION
  WHEN exception_name THEN
  Code for handing exception_name
  [WHEN another_exception THEN
  Code for handing another_exception]
  [WHEN others THEN
  code for handing any other exception.]
  
  用户必须在独立的WHEN子串中为每个异常设计异常处理代码,WHEN OTHERS子串必须放置在最后面作为缺省处理器处理没有显式处理的异常。当异常发生时,控制转到异常部分,ORACLE查 找当前异常相应的WHEN..THEN语句,捕捉异常,THEN之后的代码被执行,如果错误陷阱代码只是退出相应的嵌套块,那么程序将继续执行内部块 END后面的语句。如果没有找到相应的异常陷阱,那么将执行WHEN OTHERS。在异常部分WHEN 子串没有数量限制。
  EXCEPTION
  WHEN inventory_too_low THEN
  order_rec.staus:='backordered';
  replenish_inventory(inventory_nbr=>
  inventory_rec.sku,min_amount=>order_rec.qty-inventory_rec.qty);
  WHEN discontinued_item THEN
  --code for discontinued_item processing
  WHEN zero_divide THEN
  --code for zero_divide
  WHEN OTHERS THEN
  --code for any other exception
  END;
  
  当异常抛出后,控制无条件转到异常部分,这就意味着控制不能回到异常发生的位置,当异常被处理和解决后,控制返回到上一层执行部分的下一条语句。
  BEGIN
  DECLARE
  bad_credit exception;
  BEGIN
  RAISE bad_credit;
  --发生异常,控制转向;
  EXCEPTION
  WHEN bad_credit THEN
  dbms_output.put_line('bad_credit');
  END;
  --bad_credit异常处理后,控制转到这里
  EXCEPTION
  WHEN OTHERS THEN
  
  --控制不会从bad_credit异常转到这里
  
  --因为bad_credit已被处理
  
  END;
  
  当异常发生时,在块的内部没有该异常处理器时,控制将转到或传播到上一层块的异常处理部分。
  
  BEGIN
  DECLARE ---内部块开始
  
  bad_credit exception;
  BEGIN
  RAISE bad_credit;
  
  --发生异常,控制转向;
  EXCEPTION
  WHEN ZERO_DIVIDE THEN --不能处理bad_credite异常
  dbms_output.put_line('divide by zero error');
  
  END --结束内部块
  
  --控制不能到达这里,因为异常没有解决;
  
  --异常部分
  
  EXCEPTION
  WHEN OTHERS THEN
  --由于bad_credit没有解决,控制将转到这里
  END;
  
  5、异常的传播
  
  没有处理的异常将沿检测异常调用程序传播到外面,当异常被处理并解决或到达程序最外层传播停止。在声明部分抛出的异常将控制转到上一层的异常部分。
  
  BEGIN
  executable statements
  BEGIN
  today DATE:='SYADATE'; --ERRROR
  
  BEGIN --内部块开始
  dbms_output.put_line('this line will not execute');
  EXCEPTION
  WHEN OTHERS THEN
  
  --异常不会在这里处理
  
  END;--内部块结束
  EXCEPTION
  WHEN OTHERS THEN
  
  处理异常
  
  END

2009/03/03

unixODBC 教學

摘自:網路

在Windows上寫過資料庫程式的,應該都聽過ODBC這個東西,這東西全名是Open Database Connectivity,由M$所制定的,相關說明可以參考中文維基百科-ODBC或更詳細的英文維基百科-ODBC

簡單的說,M$為了統一所有資料庫系統在Windows上的存取方式,因此訂出了ODBC這樣的介面標準,並開放給資料庫廠商呼叫使用,而且美其名叫『Open Database Connectivity(開放資料庫互連)』,但實際上,開放在哪裡?
而且一直來說,都是M$說,別人做,哪來開放的道理?
更有趣的是,翻翻Visual C++、Visual C#、Visual Basic...等任何一本書,M$實際上建議大家使用ADO,並說使用ADO呼叫資料庫會有比較好的存取效率,因此我們完全可以認為,M$提供一個介面給別人用,但是包括他自己在內的所有人都知道,多一個介面來存取資料庫,並不會提昇效能。
不過這個介面並非都是缺點,有了ODBC,Windows上所有資料庫存取都有了統一的呼叫方式,這讓程式開發時,有了統一的資料庫呼叫,對資料轉移,程式碼的彈性都有幫助。

可惜ODBC的這一切都只在Windows上,事實上除了Windows之外,很多OS並沒有ODBC,結果說到底,感覺M$比較像是自己定規則給別人(ODBC),但是自己也建議別人不要用(建議用ADO)。

目前Linux/FreeBSD上已經有Open Source的ODBC實作,要設定使用都很容易,教學如下:
===================================
Linux 上要設定 ODBC 很容易,首先要知道,Linux 上的 ODBC 有兩套,分別是:
iODBC
unixODBC

這裡我們使用 unixODBC,並搭配 MySQL。

使用 Ubuntu 時(Debian 應該一樣),安裝套件:
unixodbc unixODBC 主程式
unixodbc-bin unixODBC 圖形化設定介面
libmyodbc MySQL 的 unixODBC Driver

安裝好之後,要設定很容易,他的設定分 2 部分:
一個部分是設定 unixODBC 的 Driver,MySQL Driver 的設定有提供 example,位置如下:
/usr/share/libmyodbc/odbcinst.ini

如果是第一次安裝 unixODBC,這時候正常是沒有任何 Driver 設定的,
那我們可以簡單的直接把設定檔複製到 /etc/ 下,如下:

# cp /usr/share/libmyodbc/odbcinst.ini /etc/

如果曾經安裝過其他 Driver,
我們可以把 /usr/share/libmyodbc/odbcinst.ini 內容加入到 /etc/odbcinst.ini

另一部份就要先提 Windows 上 ODBC 的設定,
在 Windows 上『控制台』->『系統管理程式』有個『ODBC資料來源

裡面可以設定 ODBC 的資料庫來源,內容包括 SQL Server IP、帳號、密碼、資料庫名稱...等,
然後只需要透過 ODBC 的名稱來使用這些資訊,並連線到 SQL Server。
另外值得一提的是,『ODBC資料來源』中,有所謂的『使用者來源』和『系統來源』,
這指的是這個資料庫設定,是只有使用者看得到、用得到的,還是整個系統(所有使用者)都看得到、用得到。

而在 unixODBC 上也是一樣的,只是這些設定儲存在設定檔中,
以『系統來源』來說,所有使用者都能使用的 ODBC 設定,設定檔是 /etc/odbc.ini;
以『使用者來源』來說,只有自己能使用的 ODBC 設定,設定檔是 ~/.odbc.ini。

設定檔範例如下:
[MySQL-Optical_Disc_Manage]
Description = MySQL Optical_Disc_Manage
Driver = MySQL
Server = 192.168.1.6
Database = Optical_Disc_Manage
Port = 3306


格式說明如下:
[ODBC連線名稱]
Description = 這個連線的描述
Driver = Driver的類型,這部分參考 /etc/odbcinst.ini
Server = SQL Server IP
Database = 資料庫名稱
Port = 連接埠埠號


而 odbcinst.ini 正常來說,Driver 都要提供範例,以這邊 MySQL 為例,它的內容如下:
[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout =
CPReuse =


注意到『[MySQL]』,這就是我們上面 odbc.ini 中提到的 Driver 欄位要填的內容。

上面說了一堆之後,我們可以發現到 unixODBC 設定實在有夠麻煩,尤其是 odbc.ini 的設定,
有沒有類似 Windows 上『ODBC資料來源』那樣的 GUI 設定介面呢?

有~我們前面安裝的套件『unixodbc-bin』,裡面就有提供這樣的工具給我們使用,
unixODBC 有 2 個圖形化介面工具可以使用,分別是:
ODBCConfig
DataManager

其中最重要、好用的,就是 ODBCConfig,如下執行:
# ODBCConfig

執行後會看到一個類似 Windows 上『ODBC資料來源』的 GUI 視窗。

如果前面已經有按照說明設定過了,
以我來說,我將上面 odbc.ini 的設定存成 ~/.odbc.ini,
那麼進入 ODBCConfig 介面後,我會在『User DSN』分頁看到這個設定。

目前,中文似乎還有問題,如何指定編碼目前我還不會。
==============================================

Linux上如何讀取MS Access(*.mdb)資料庫-MDB Tools

摘自:Linux Wiki

mdb是Microsoft Access使用的資料庫格式,非常適合小規模資料庫。要在Linux中訪問mdb資料庫,可以使用mdbtools,目前還不支持寫入mdb格式的資料庫,但其網站上稱將從下一個版本,即0.6版起加入寫入支持,mdbtools的網站為: http://mdbtools.sourceforge.net/

軟體安裝

您可以從mdbtools的網站下載這個軟體: http://mdbtools.sourceforge.net/

另外,如果使用Debian或Ubuntu,可以直接用apt-get安裝:

libmdbtools - mdbtools libraries
mdbtools - JET / MS Access database (MDB) tools
mdbtools-dev - mdbtools development files
mdbtools-gmdb - JET / MS Access database (MDB) file viewer
TODO:
常見發行版安裝mdbtools的方法。

圖形界面查看

mdbtools提供了簡便的圖形界面查看的工具,可以查看、導出數據,也可以執行查詢。

執行方法:

gmdb2

文本界面的工具

mdbtools提供了一系列文本界面的工具,目前,這些工具功能更強大。

mdb-tables
列出資料庫中的表
mdb-sql
使用sql查詢語句管理資料庫,功能強大,可以man mdb-sql查看幫助
mdb-ver
查看Access資料庫的版本。
mdb-export
把資料庫導出到csv格式
mdb-schema
以DDL形式導出資料庫結構

2009/03/02

MS Word MS Excel教學課程下載

轉自:網路

1)Word 2003教學Flash(36課)--54.3MB

課程目錄及下載:

A 基本操篇
A01 word的工作環境介紹
A02 標題文字製作
A03 字型效果調整
A04 儲存檔案
A05 設定自動存檔
http://140.111.113.9/02office/word2003/swf/a01.swf
http://140.111.113.9/02office/word2003/swf/a02.swf
http://140.111.113.9/02office/word2003/swf/a03.swf
http://140.111.113.9/02office/word2003/swf/a04.swf
http://140.111.113.9/02office/word2003/swf/a05.swf

B 海報製作
B01 版面設定_設定紙張
B02 加入文字藝術師造型字
B03 插入圖片檔
B04 垂直文字方塊
B05 預覽列印功能
http://140.111.113.9/02office/word2003/swf/b01.swf
http://140.111.113.9/02office/word2003/swf/b02.swf
http://140.111.113.9/02office/word2003/swf/b03.swf
http://140.111.113.9/02office/word2003/swf/b04.swf
http://140.111.113.9/02office/word2003/swf/b05.swf

C 功課表製作
C01 開啟舊檔
C02 表格基本操作
C03 儲存格的設定
C04 表格資料建立
C05 欄列的增加與刪除
C06 文字對齊設定
C07 表格自動格式設定
http://140.111.113.9/02office/word2003/swf/c01.swf
http://140.111.113.9/02office/word2003/swf/c02.swf
http://140.111.113.9/02office/word2003/swf/c03.swf
http://140.111.113.9/02office/word2003/swf/c04.swf
http://140.111.113.9/02office/word2003/swf/c05.swf
http://140.111.113.9/02office/word2003/swf/c06.swf
http://140.111.113.9/02office/word2003/swf/c07.swf

D 游旅記事
D01 段落縮排
D02 快取圖案製作
D03 造型填圖設計
D04 首字放大
D05 標點符號
http://140.111.113.9/02office/word2003/swf/d01.swf
http://140.111.113.9/02office/word2003/swf/d02.swf
http://140.111.113.9/02office/word2003/swf/d03.swf
http://140.111.113.9/02office/word2003/swf/d04.swf
http://140.111.113.9/02office/word2003/swf/d05.swf

E 詩詞編輯
E01 文字縮排應用
E02 美化文章
E03 文字格式複製
E04 美工圖案應用
http://140.111.113.9/02office/word2003/swf/e01.swf
http://140.111.113.9/02office/word2003/swf/e02.swf
http://140.111.113.9/02office/word2003/swf/e03.swf
http://140.111.113.9/02office/word2003/swf/e04.swf

F 賀卡設計
F01 標題文字製作
F02 許願蛋糕製作
F03 立體閃亮星星
F04 造型填入照片
F05 頁面花邊
http://140.111.113.9/02office/word2003/swf/f01.swf
http://140.111.113.9/02office/word2003/swf/f02.swf
http://140.111.113.9/02office/word2003/swf/f03.swf
http://140.111.113.9/02office/word2003/swf/f04.swf
http://140.111.113.9/02office/word2003/swf/f05.swf

G 班刊製作
G01 版面分欄製作
G02 主題製作
G03 頁首頁尾製作
G04 不同的分欄方式
G05 WORD文件轉網頁
http://140.111.113.9/02office/word2003/swf/g01.swf
http://140.111.113.9/02office/word2003/swf/g02.swf
http://140.111.113.9/02office/word2003/swf/g03.swf
http://140.111.113.9/02office/word2003/swf/g04.swf
http://140.111.113.9/02office/word2003/swf/g05.swf


2)Excel 2002教學Flash(100課)--77.8 MB

課程目錄及下載:

A Excel操作環境介紹
A01 啟動excel
A02 excel完整使用說明
A03 工作表大小的調整
A04 顯示比例調整
A05 操作環境介紹
http://140.111.113.9/02office/excel2002/swf/a01.swf
http://140.111.113.9/02office/excel2002/swf/a02.swf
http://140.111.113.9/02office/excel2002/swf/a03.swf
http://140.111.113.9/02office/excel2002/swf/a04.swf
http://140.111.113.9/02office/excel2002/swf/a05.swf

B 建立工作表
B01 資料的輸入與修改
B02 自動加總
B03 公式的拷貝
B04 資料格式的設定
B05 選定區間方式輸入
B06 標題置中技巧
B07 檔案的儲存
B08 開啟舊檔
B09 建立圖表
B10 重新命名工作表
http://140.111.113.9/02office/excel2002/swf/b01.swf
http://140.111.113.9/02office/excel2002/swf/b02.swf
http://140.111.113.9/02office/excel2002/swf/b03.swf
http://140.111.113.9/02office/excel2002/swf/b04.swf
http://140.111.113.9/02office/excel2002/swf/b05.swf
http://140.111.113.9/02office/excel2002/swf/b06.swf
http://140.111.113.9/02office/excel2002/swf/b07.swf
http://140.111.113.9/02office/excel2002/swf/b08.swf
http://140.111.113.9/02office/excel2002/swf/b09.swf
http://140.111.113.9/02office/excel2002/swf/b10.swf

C 資料輸入
C01 輸入資料確認/取消鈕
C02 儲存格內容的修改
C03 選定區間的儲存格
C04 常數資料的輸入
C05 以相同值填滿其它儲存格
C06 以遞增方式填滿其它儲存格
C07 自訂自動填滿格式功能
C08 列印檔案
http://140.111.113.9/02office/excel2002/swf/c01.swf
http://140.111.113.9/02office/excel2002/swf/c02.swf
http://140.111.113.9/02office/excel2002/swf/c03.swf
http://140.111.113.9/02office/excel2002/swf/c04.swf
http://140.111.113.9/02office/excel2002/swf/c05.swf
http://140.111.113.9/02office/excel2002/swf/c06.swf
http://140.111.113.9/02office/excel2002/swf/c07.swf
http://140.111.113.9/02office/excel2002/swf/c08.swf

D 編輯工作表
D01 插入列
D02 刪除列
D03 插入欄
D04 刪除欄
D05 插入儲存格
D06 刪除儲存格
D07 儲存格的移動
D08 儲存格的複製
D09 選擇性貼上指令
D10 清除儲存格
http://140.111.113.9/02office/excel2002/swf/d01.swf
http://140.111.113.9/02office/excel2002/swf/d02.swf
http://140.111.113.9/02office/excel2002/swf/d03.swf
http://140.111.113.9/02office/excel2002/swf/d04.swf
http://140.111.113.9/02office/excel2002/swf/d05.swf
http://140.111.113.9/02office/excel2002/swf/d06.swf
http://140.111.113.9/02office/excel2002/swf/d07.swf
http://140.111.113.9/02office/excel2002/swf/d08.swf
http://140.111.113.9/02office/excel2002/swf/d09.swf
http://140.111.113.9/02office/excel2002/swf/d10.swf

E 公式輸入
E01 自動加總按鈕
E02 建立數學公式
E03 貼上函數建立公式
E04 定義範圍名稱
E05 計算不符合資格數目
E06 排序資料
E07 自動格式.儲存格
E08 自動計算功能
http://140.111.113.9/02office/excel2002/swf/e01.swf
http://140.111.113.9/02office/excel2002/swf/e02.swf
http://140.111.113.9/02office/excel2002/swf/e03.swf
http://140.111.113.9/02office/excel2002/swf/e04.swf
http://140.111.113.9/02office/excel2002/swf/e05.swf
http://140.111.113.9/02office/excel2002/swf/e06.swf
http://140.111.113.9/02office/excel2002/swf/e07.swf
http://140.111.113.9/02office/excel2002/swf/e08.swf

F 資料格式的設定
F01 欄寬的更改
F02 列高的更改
F03 格式化的字型
F04 設定資料對齊的方式
F05 字型色彩或圖樣處理
F06 框線的設定
F07 數學格式符號的應用
F08 設定格式化條件
http://140.111.113.9/02office/excel2002/swf/f01.swf
http://140.111.113.9/02office/excel2002/swf/f02.swf
http://140.111.113.9/02office/excel2002/swf/f03.swf
http://140.111.113.9/02office/excel2002/swf/f04.swf
http://140.111.113.9/02office/excel2002/swf/f05.swf
http://140.111.113.9/02office/excel2002/swf/f06.swf
http://140.111.113.9/02office/excel2002/swf/f07.swf
http://140.111.113.9/02office/excel2002/swf/f08.swf

G 活頁簿的設定
G01 多個工作表製作
G02 移動工作表
G03 複製工作表
G04 不同工作表的儲存格的複製
G05 不同工作表中公式的運用
G06 快速列出活頁簿的內容
http://140.111.113.9/02office/excel2002/swf/g01.swf
http://140.111.113.9/02office/excel2002/swf/g02.swf
http://140.111.113.9/02office/excel2002/swf/g03.swf
http://140.111.113.9/02office/excel2002/swf/g04.swf
http://140.111.113.9/02office/excel2002/swf/g05.swf
http://140.111.113.9/02office/excel2002/swf/g06.swf

H 圖表的建立
H01 建立圖表步驟
H02 更改圖表字型大小
H03 圖表資料顯示設定
H04 刪除圖表的資料數列
H05 增加圖表的資料數列
H06 更改圖表類型
H07 改變圖表資料數列順序
H08 圖表的格線設定
H09 圖表的圖例設定
H10 格式化座標軸的標題
H11 建立趨勢預測線
http://140.111.113.9/02office/excel2002/swf/h01.swf
http://140.111.113.9/02office/excel2002/swf/h02.swf
http://140.111.113.9/02office/excel2002/swf/h03.swf
http://140.111.113.9/02office/excel2002/swf/h04.swf
http://140.111.113.9/02office/excel2002/swf/h05.swf
http://140.111.113.9/02office/excel2002/swf/h06.swf
http://140.111.113.9/02office/excel2002/swf/h07.swf
http://140.111.113.9/02office/excel2002/swf/h08.swf
http://140.111.113.9/02office/excel2002/swf/h09.swf
http://140.111.113.9/02office/excel2002/swf/h10.swf
http://140.111.113.9/02office/excel2002/swf/h11.swf

I 工作表的列印
I01 預覽列印功能
I02 版面設定
I03 列印工作表
I04 列印縮放設定
http://140.111.113.9/02office/excel2002/swf/i01.swf
http://140.111.113.9/02office/excel2002/swf/i02.swf
http://140.111.113.9/02office/excel2002/swf/i03.swf
http://140.111.113.9/02office/excel2002/swf/i04.swf

J 資料排序與統計
J01 篩選清單資料
J02 資料清單排序
J03 小計指令加總
J04 小計指令平均值
J05 顯示或隱藏清單的明細資料
J06 利用小計清單建立圖表
J07 刪除大綱結構
http://140.111.113.9/02office/excel2002/swf/j01.swf
http://140.111.113.9/02office/excel2002/swf/j02.swf
http://140.111.113.9/02office/excel2002/swf/j03.swf
http://140.111.113.9/02office/excel2002/swf/j04.swf
http://140.111.113.9/02office/excel2002/swf/j05.swf
http://140.111.113.9/02office/excel2002/swf/j06.swf
http://140.111.113.9/02office/excel2002/swf/j07.swf

K 樞紐分析表
K01 建立樞紐分析表
K02 修改樞紐分析表
K03 修改樞紐分析表的計算公式
K04 資料修改_更新樞紐分析表
K05 更改樞紐分析表的版面配置
http://140.111.113.9/02office/excel2002/swf/k01.swf
http://140.111.113.9/02office/excel2002/swf/k02.swf
http://140.111.113.9/02office/excel2002/swf/k03.swf
http://140.111.113.9/02office/excel2002/swf/k04.swf
http://140.111.113.9/02office/excel2002/swf/k05.swf

L 輸出網頁格式檔
L01 將活頁簿存成網頁檔
L02 開啟HTML格式檔
L03 WEB畫面預覽
L04 超鏈結
L05 輸出互動式網頁
http://140.111.113.9/02office/excel2002/swf/l01.swf
http://140.111.113.9/02office/excel2002/swf/l02.swf
http://140.111.113.9/02office/excel2002/swf/l03.swf
http://140.111.113.9/02office/excel2002/swf/l04.swf
http://140.111.113.9/02office/excel2002/swf/l05.swf

M 製作成績統計表
M01 製作成績單
M02 設定格式化條件
M03 自動加總_計算總分
M04 自動加總_填滿
M05 成績的平均分數
M06 設定數字格式
M07 排序資料
M08 保護檔案
http://140.111.113.9/02office/excel2002/swf/m01.swf
http://140.111.113.9/02office/excel2002/swf/m02.swf
http://140.111.113.9/02office/excel2002/swf/m03.swf
http://140.111.113.9/02office/excel2002/swf/m04.swf
http://140.111.113.9/02office/excel2002/swf/m05.swf
http://140.111.113.9/02office/excel2002/swf/m06.swf
http://140.111.113.9/02office/excel2002/swf/m07.swf
http://140.111.113.9/02office/excel2002/swf/m08.swf

N Office一般功能
N01 插入美工圖案
N02 插入圖片檔
N03 插入快取圖案
N04 插入文字藝術師
N05 插入組織圖
http://140.111.113.9/02office/excel2002/swf/n01.swf
http://140.111.113.9/02office/excel2002/swf/n02.swf
http://140.111.113.9/02office/excel2002/swf/n03.swf
http://140.111.113.9/02office/excel2002/swf/n04.swf
http://140.111.113.9/02office/excel2002/swf/n05.swf


3)PowerPoint 2003教學Flash(41課)--48.4MB

課程目錄及下載:

A 建立簡報
A01 啟動PowerPoint2003並建立桌面捷徑_基本操作
A02 快速建立簡報_內容大綱精靈
A03 四種檢視模式
A04 儲存簡報檔_開啟簡報檔
A05 簡報列印
A06 大綱模式編輯&新增投影片
A07 在投影片模式內編輯&刪除投影片
A08 調整投影片順序
A09 顯示比例的調整
http://140.111.113.9/02office/powerpoint2003/swf/a01.swf
http://140.111.113.9/02office/powerpoint2003/swf/a02.swf
http://140.111.113.9/02office/powerpoint2003/swf/a03.swf
http://140.111.113.9/02office/powerpoint2003/swf/a04.swf
http://140.111.113.9/02office/powerpoint2003/swf/a05.swf
http://140.111.113.9/02office/powerpoint2003/swf/a06.swf
http://140.111.113.9/02office/powerpoint2003/swf/a07.swf
http://140.111.113.9/02office/powerpoint2003/swf/a08.swf
http://140.111.113.9/02office/powerpoint2003/swf/a09.swf

B 編輯簡報
B01 新增投影片類型
B02 編輯投影片內容
B03 更改投影片版面配置
B04 套用投影片設計範本
B05 投影片放映說明
B06 放映時的畫筆功能
http://140.111.113.9/02office/powerpoint2003/swf/b01.swf
http://140.111.113.9/02office/powerpoint2003/swf/b02.swf
http://140.111.113.9/02office/powerpoint2003/swf/b03.swf
http://140.111.113.9/02office/powerpoint2003/swf/b04.swf
http://140.111.113.9/02office/powerpoint2003/swf/b05.swf
http://140.111.113.9/02office/powerpoint2003/swf/b06.swf

C 全新建立簡報方式
C01 建立空白簡報_套用範本
C02 加入美工圖案
C03 含美工圖案的簡報類型
C04 加入外部圖形檔
C05 下載更多的美工圖案
C06 PowerPoint內建簡報
C07 母片的應用_所有投影片有相同的圖片或文字
C08 文字藝術師
C09 加入心形圖片
C10 加入組織圖
C11 加入圖表
http://140.111.113.9/02office/powerpoint2003/swf/c01.swf
http://140.111.113.9/02office/powerpoint2003/swf/c02.swf
http://140.111.113.9/02office/powerpoint2003/swf/c03.swf
http://140.111.113.9/02office/powerpoint2003/swf/c04.swf
http://140.111.113.9/02office/powerpoint2003/swf/c05.swf
http://140.111.113.9/02office/powerpoint2003/swf/c06.swf
http://140.111.113.9/02office/powerpoint2003/swf/c07.swf
http://140.111.113.9/02office/powerpoint2003/swf/c08.swf
http://140.111.113.9/02office/powerpoint2003/swf/c09.swf
http://140.111.113.9/02office/powerpoint2003/swf/c10.swf
http://140.111.113.9/02office/powerpoint2003/swf/c11.swf

D 多媒體簡報
D01 加入聲音檔
D02 音樂檔由第一張播放到最後一張投影片
D03 加入影片檔
D04 加入Flash動畫檔
D05 投影片過場設定
D06 設定投影片的播放方式
D07 錄製旁白語音檔
http://140.111.113.9/02office/powerpoint2003/swf/d01.swf
http://140.111.113.9/02office/powerpoint2003/swf/d02.swf
http://140.111.113.9/02office/powerpoint2003/swf/d03.swf
http://140.111.113.9/02office/powerpoint2003/swf/d04.swf
http://140.111.113.9/02office/powerpoint2003/swf/d05.swf
http://140.111.113.9/02office/powerpoint2003/swf/d06.swf
http://140.111.113.9/02office/powerpoint2003/swf/d07.swf

E 互動式設定
E01 投影片跳躍播放
E02 投影片超連結製作
E03 結束投影片播放
E04 啟動WORD程式
E05 將簡報檔封裝成光碟
E06 簡報轉換成播放檔
E07 簡報轉換網頁檔
E08 網頁超連結設定
http://140.111.113.9/02office/powerpoint2003/swf/e01.swf
http://140.111.113.9/02office/powerpoint2003/swf/e02.swf
http://140.111.113.9/02office/powerpoint2003/swf/e03.swf
http://140.111.113.9/02office/powerpoint2003/swf/e04.swf
http://140.111.113.9/02office/powerpoint2003/swf/e05.swf
http://140.111.113.9/02office/powerpoint2003/swf/e06.swf
http://140.111.113.9/02office/powerpoint2003/swf/e07.swf
http://140.111.113.9/02office/powerpoint2003/swf/e08.swf

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