PostRank

2009/03/16

如何取得Concurrent Request ID?!

Oracle Report:
1. 宣告Number型態的User Parameter : P_CONC_REQUEST_ID
2. 在Before Report Trigger中加上: srw.user_exit( 'FND SRWINIT' )
3. 在After Report Trigger中加上 : srw.user_exit( 'FND SRWEXIT' )
4. P_CONC_REQUEST_ID中就放著目前的Concurrent request id

PL/SQL:
fnd_profile.value('CONC_REQUEST_ID')

SELECT fnd_global.conc_request_id  FROM dual ;

2009/03/12

快速檢查 DB alert log 的語法

摘自:網路

不知道你有沒有遇過需要去 DB alert log 裡頭
去抓取 ORA- 開頭發生的狀況

如果你用 vi 去搜尋,只能一筆一筆依序判讀,很沒效率

其實可以透過 "sed" 的語法,篩選特定字元,顯示上一行的「時間」

例如:
sed '/ORA-/H;x;/\n/!d' alert_PROD.log

顯示的結果: 這樣可以快速列出 db alert log 發生的問題跟時間
Wed May 21 20:17:35 2008
ORA-1652: unable to extend temp segment by 16 in tablespace TEMP
Wed May 21 20:17:36 2008
ORA-1652: unable to extend temp segment by 16 in tablespace TEMP
Thu May 22 01:14:53 2008
ORA-01555 caused by SQL statement below (Query Duration=39068 sec, SCN: 0x0007.69a1780f):


另外呢,如果我們想要找..上次開關機之間的時間?
這樣就很有效率去顯示從 alert log 記錄的DB開關 時間囉

### 顯示 alter database open 的上一行 系統時間

sed '/ALTER DATABASE OPEN/H;x;/\n/!d' alert_PROD.log

輸出片段:
Thu May 1 09:10:09 2008
ALTER DATABASE OPEN
replication_dependency_tracking turned off (no async multimaster replication found)
Completed: ALTER DATABASE OPEN
Thu May 1 11:44:23 2008
ALTER DATABASE OPEN
replication_dependency_tracking turned off (no async multimaster replication found)
Completed: ALTER DATABASE OPEN
Thu May 15 18:20:29 2008
ALTER DATABASE OPEN
replication_dependency_tracking turned off (no async multimaster replication found)
Completed: ALTER DATABASE OPEN

Oracle Partition Table

摘自:網路

1.1 分区表PARTITION table

ORACLE里如果遇到特别大的表,可以使用分区的表来改变其应用程序的性能。

1.1.1 分区表的建立:

某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下:

范围分区表:

CREATE TABLE sales

(invoice_no NUMBER,

...

sale_date DATE NOT NULL )

PARTITION BY RANGE (sale_date)

(PARTITION sales1999_q1

VALUES LESS THAN (TO_DATE(1999-04-01,YYYY-MM-DD)

TABLESPACE ts_sale1999q1,

PARTITION sales1999_q2

VALUES LESS THAN (TO_DATE(1999-07-01,YYYY-MM-DD)

TABLESPACE ts_sale1999q2,

PARTITION sales1999_q3

VALUES LESS THAN (TO_DATE(1999-10-01,YYYY-MM-DD)

TABLESPACE ts_sale1999q3,

PARTITION sales1999_q4

VALUES LESS THAN (TO_DATE(2000-01-01,YYYY-MM-DD)

TABLESPACE ts_sale1999q4 );

--values less than (maxvalue)

列表分区表:

create table emp (

empno number(4),

ename varchar2(30),

location varchar2(30))

partition by list (location)

(partition p1 values ('北京'),

partition p2 values ('上海','天津','重庆'),

partition p3 values ('广东','福建')

partition p0 values (default)

);

哈希分区:

create table emp (

empno number(4),

ename varchar2(30),

sal number)

partition by hash (empno)

partitions 8

store in (emp1,emp2,emp3,emp4,emp5,emp6,emp7,emp8);

组合分区:

范围哈希组合分区:

create table emp (

empno number(4),

ename varchar2(30),

hiredate date)

partition by range (hiredate)

subpartition by hash (empno)

subpartitions 2

(partition e1 values less than (to_date('20020501','YYYYMMDD')),

partition e2 values less than (to_date('20021001','YYYYMMDD')),

partition e3 values less than (maxvalue));

范围列表组合分区:

CREATE TABLE customers_part (

customer_id NUMBER(6),

cust_first_name VARCHAR2(20),

cust_last_name VARCHAR2(20),

nls_territory VARCHAR2(30),

credit_limit NUMBER(9,2))

PARTITION BY RANGE (credit_limit)

SUBPARTITION BY LIST (nls_territory)

SUBPARTITION TEMPLATE

(SUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND'),

SUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND'),

SUBPARTITION other VALUES (DEFAULT))

(PARTITION p1 VALUES LESS THAN (1000),

PARTITION p2 VALUES LESS THAN (2500),

PARTITION p3 VALUES LESS THAN (MAXVALUE));

create table t1 (id1 number,id2 number)

partition by range (id1) subpartition by list (id2)

(partition p11 values less than (11)

(subpartition subp1 values (1))

);

索引分区:

CREATE INDEX month_ix ON sales(sales_month)
GLOBAL PARTITION BY RANGE(sales_month)
(PARTITION pm1_ix VALUES LESS THAN (2)
PARTITION pm12_ix VALUES LESS THAN (MAXVALUE));

1.1.2 分区表的维护:

增加分区:

ALTER TABLE sales ADD PARTITION sales2000_q1

VALUES LESS THAN (TO_DATE(2000-04-01,YYYY-MM-DD)

TABLESPACE ts_sale2000q1;

如果已有maxvalue分区,不能增加分区,可以采取分裂分区的办法增加分区!

删除分区:

ALTER TABLE sales DROP PARTION sales1999_q1;

截短分区:

alter table sales truncate partiton sales1999_q2;

合并分区:

alter table sales merge partitons sales1999_q2, sales1999_q3 into sales1999_q23;

alter index ind_t2 rebuild partition p123 parallel 2;

分裂分区:

ALTER TABLE sales

SPLIT PARTITON sales1999_q4

AT TO_DATE (1999-11-01,YYYY-MM-DD)

INTO (partition sales1999_q4_p1, partition sales1999_q4_p2) ;

alter table t2 split partition p123 values (1,2) into (partition p12,partition p3);

交换分区:

alter table x exchange partition p0 with table bsvcbusrundatald ;

访问指定分区:

select * from sales partition(sales1999_q2)

EXPORT指定分区:

exp sales/sales_password tables=sales:sales1999_q1

file=sales1999_q1.dmp

IMPORT指定分区:

imp sales/sales_password FILE =sales1999_q1.dmp

TABLES = (sales:sales1999_q1) IGNORE=y

查看分区信息

user_tab_partitions, user_segments

注:若分区表跨不同表空间,做导出、导入时目标数据库必须预建这些表空间。分表区各区所在表空间在做导入时目标数据库一定要预建这些表空间!这些表空间不一定是用户的默认表空间,只要存在即可。如果有一个不存在,就会报错!

默 认时,对分区表的许多表维护操作会使全局索引不可用,标记成UNUSABLE。 那么就必须重建整个全局索引或其全部分区。如果已被分区,Oracle 允许在用于维护操作的ALTER TABLE 语句中指定UPDATE GLOBAL INDEXES 来重载这个默认特性,指定这个子句也就告诉Oracle 当它执行维护操作的DDL 语句时更新全局索引,这提供了如下好处:
1.在操作基础表的同时更新全局索引这就不需要后来单独地重建全局索引;
2.因为没有被标记成UNUSABLE, 所以全局索引的可用性更高了,甚至正在执行分区的DDL 语句时仍然可用索引来访问表中的其他分区,避免了查询所有失效的全局索引的名字以便重建它们;
另外在指定UPDATE GLOBAL INDEXES 之前还要考虑如下性能因素:
1.因为要更新事先被标记成UNUSABLE 的索引,所以分区的DDL 语句要执行更长时间,当然这要与先不更新索引而执行DDL 然后再重建索引所花的时间做个比较,一个适用的规则是如果分区的大小小于表的大小的5% ,则更新索引更快一点;
2.DROP TRUNCATE 和EXCHANGE 操作也不那么快了,同样这必须与先执行DDL 然后再重建所有全局索引所花的时间做个比较;
3.要登记对索引的更新并产生重做记录和撤消记录,重建整个索引时可选择NOLOGGING;
4.重建整个索引产生一个更有效的索引,因为这更利于使用空间,再者重建索引时允许修改存储选项。
注意分区索引结构表不支持UPDATE GLOBAL INDEXES 子句。

1.1.3 普通表变为分区表

将已存在数据的普通表转变为分区表,没有办法通过修改属性的方式直接转化为分区表,必须通过重建的方式进行转变,一般可以有三种方法,视不同场景使用:

用例:

方法一:利用原表重建分区表。

CREATE TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
INSERT INTO T
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
COMMIT;

CREATE TABLE T_NEW (ID, TIME) PARTITION BY RANGE (TIME)
(PARTITION P1 VALUES LESS THAN (TO_DATE('2000-1-1', 'YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2002-1-1', 'YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
PARTITION P4 VALUES LESS THAN (MAXVALUE))
AS SELECT ID, TIME FROM T;

RENAME T TO T_OLD;

RENAME T_NEW TO T;

SELECT COUNT(*) FROM T;

COUNT(*)
----------
5000

SELECT COUNT(*) FROM T PARTITION (P1);

COUNT(*)
----------
2946

SELECT COUNT(*) FROM T PARTITION (P2);

COUNT(*)
----------
731

SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
1096

优点:方法简单易用,由于采用DDL语句,不会产生UNDO,且只产生少量REDO,效率相对较高,而且建表完成后数据已经在分布到各个分区中了。

不足:对于数据的一致性方面还需要额外的考虑。由于几乎没有办法通过手工锁定T表的方式保证一致性,在执行CREATE TABLE语句和RENAME T_NEW TO T语句直接的修改可能会丢失,如果要保证一致性,需要在执行完语句后对数据进行检查,而这个代价是比较大的。另外在执行两个RENAME语句之间执行的对T的访问会失败。

适用于修改不频繁的表,在闲时进行操作,表的数据量不宜太大。

方法二:使用交换分区的方法。

Drop table t;
CREATE
TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
INSERT INTO T
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
COMMIT;

CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
(PARTITION P1 VALUES LESS THAN (TO_DATE('2005-9-1', 'YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (MAXVALUE));

ALTER TABLE T_NEW EXCHANGE PARTITION P1 WITH TABLE T;

RENAME T TO T_OLD;

RENAME T_NEW TO T;

优点:只是对数据字典中分区和表的定义进行了修改,没有数据的修改或复制,效率最高。如果对数据在分区中的分布没有进一步要求的话,实现比较简单。在执行完RENAME操作后,可以检查T_OLD中是否存在数据,如果存在的话,直接将这些数据插入到T中,可以保证对T插入的操作不会丢失。

不足:仍然存在一致性问题,交换分区之后RENAME T_NEW TO T之前,查询、更新和删除会出现错误或访问不到数据。如果要求数据分布到多个分区中,则需要进行分区的SPLIT操作,会增加操作的复杂度,效率也会降低。

适用于包含大数据量的表转到分区表中的一个分区的操作。应尽量在闲时进行操作。

方法三:Oracle9i以上版本,利用在线重定义功能

Drop table t;
CREATE
TABLE T (ID NUMBER PRIMARY KEY, TIME DATE);
INSERT INTO T
SELECT ROWNUM, SYSDATE - ROWNUM FROM DBA_OBJECTS WHERE ROWNUM <=
5000
;
COMMIT;

EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');

PL/SQL 过程已成功完成。

CREATE TABLE T_NEW (ID NUMBER PRIMARY KEY, TIME DATE) PARTITION BY RANGE (TIME)
(PARTITION P1 VALUES LESS THAN (TO_DATE('2004-7-1', 'YYYY-MM-DD')),
PARTITION P2 VALUES LESS THAN (TO_DATE('2005-1-1', 'YYYY-MM-DD')),
PARTITION P3 VALUES LESS THAN (TO_DATE('2005-7-1', 'YYYY-MM-DD')),
PARTITION P4 VALUES LESS THAN (MAXVALUE));

表已创建。

EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_NEW');

PL/SQL 过程已成功完成。

EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_NEW');

PL/SQL 过程已成功完成。

SELECT COUNT(*) FROM T;

COUNT(*)
----------
5000

SELECT COUNT(*) FROM T PARTITION (P3);

COUNT(*)
----------
1096

优点:保证数据的一致性,在大部分时间内,表T都可以正常进行DML操作。只在切换的瞬间锁表,具有很高的可用性。这种方法具有很强的灵活性,对各种不同的需要都能满足。而且,可以在切换前进行相应的授权并建立各种约束,可以做到切换完成后不再需要任何额外的管理操作。

不足:实现上比上面两种略显复杂。

适用于各种情况。

这里只给出了在线重定义表的一个最简单的例子,详细的描述和例子可以参考下面两篇文章。

Oracle的在线重定义表功能:http://blog.itpub.net/post/468/12855

Oracle的在线重定义表功能(二):http://blog.itpub.net/post/468/12962


XSB:把一个已存在数据的大表改成分区表:

第一种(表不是太大):

1.把原表改名:
rename xsb1 to xsb2;
2.创建分区表:
CREATE TABLE xsb1
PARTITION BY LIST (c_test)
(PARTITION xsb1_p1 VALUES (1),
PARTITION xsb1_p2 VALUES (2),
PARTITION xsb1_p0 VALUES (default))
nologging AS SELECT * FROM xsb2;
3.将原表上的触发器、主键、索引等应用到分区表上;
4.删除原表:
drop table xsb2;

第二种(表很大):

1. 创建分区表:
CREATE TABLE x PARTITION BY LIST (c_test) [range ()]
(PARTITION p0 VALUES [less than ](1) tablespace tbs1,
PARTITION p2 VALUES (2) tablespace tbs1,
PARTITION xsb1_p0 VALUES ([maxvalue]default))
AS SELECT * FROM xsb2 [where 1=2];

2. 交换分区 alter table x exchange partition p0 with table bsvcbusrundatald ;

3. 原表改名alter table bsvcbusrundatald rename to x0;

4. 新表改名alter table x rename to bsvcbusrundatald ;

5. 删除原表drop table x0;

6. 创建新表触发器和索引create index ind_busrundata_lp on bsvcbusrundatald(。。。) local tablespace tbs_brd_ind ;


或者:

1. 规划原大表中数据分区的界限,原则上将原表中近期少量数据复制至另一表;

2. 暂停原大表中的相关触发器;

3. 删除原大表中近期数据;

4. 改名原大表名称;

5. 创建分区表;

6. 交换分区;

7. 重建相关索引及触发器(先删除之再重建).

参考脚本:

select count(*) from t1 where recdate>sysdate-2

create table x2 nologging as select * from t1 where recdate>trunc(sysdate-2)

alter triger trg_t1 disable

delete t1 where recdate>sysdate-2

commit

rename t1 to x1

create table t1 [nologging] partition by range(recdate)

(partition pbefore values less than (trunc(sysdate-2)),

partition pmax values less than (maxvalue))

as select * from x1 where 1=2

alter table t1 exchange partition pbefore with table x1

alter table t1 exchange partition pmax with table x2

drop table x2

[重建触发器]

drop table x1


1.1.4 参考材料:
如果表中预期的数据量较大,通常都需要考虑使用分区表,确定使用分区表后,还要确定什么类型的分区 (range partition、hash partition、list partition等)、分区区间大小等。分区的创建最好与程序有某种默契,偶曾经创建分区表,按自然月份定义分区的,但程序却在查询时默认的开始时间与 结束时间是:当前日期-30至当前日期,比如当天是9.18号,那查询条件被产生为8.18-9.18,结果分区后并不没有大幅提高性能,后来对程序的查 询日期做了调整,按自然月查询,系统的负载小了很多。

从Oracle8.0开始支持表分区(MSSQL2005开始支持表分区)。

Oracle9i 分区能够提高许多应用程序的可管理性、性能与可用性。分区可以将表、索引及索引编排表进一步划分,从而可以更精细地对这些数据库对象进行管理和访问。 Oracle 提供了种类繁多的分区方案以满足所有的业务需要。另外,由于在 SQL 语句中是完全透明的,所以分区可以用于几乎所有的应用程序。

分区表允许将数据分成被称为分区甚至子分区的更小的更好管理的块。索引也可以这么分区。每个分区可以被单独管理,可以不依赖于其他分区而单独发挥作用,因此提供了一个更有利于可用性和性能的结构。

分区可以提高可管理性、性能与可用性,从而给各种各样的应用程序带来极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区 还能够在很大程度上简化日常管理任务。分区还使数据库设计人员和管理员能够解决尖端应用程序带来的最难的问题。分区是建立上亿万字节数据系统或需要极高可 用性系统的关键工具。

在多CPU配置环境下,如果打算使用并行执行,则分区提供了另一种并行的方法。通过给表或索引的不同分区分配不同的并行执行服务器,就可以并行执行对分区表和分区索引的操作。

表或索引的分区和子分区都共享相同的逻辑属性。例如表的所有分区或子分区共享相同的列和约束定义,一个索引的分区或子分区共享相同的索引选项。然而它们可以具有不同的物理属性如表空间。

尽管不需要将表或索引的每个分区或子分区放在不同的表空间,但这样做更好。将分区存储到不同的表空间能够

l 减少数据在多个分区中冲突的可能性

l 可以单独备份和恢复每个分区

l 控制分区与磁盘驱动器之间的映射对平衡I/O 负载是重要的

l 改善可管理性可用性和性能

分区操作对现存的应用和运行在分区表上的标准DML 语句来说是透明的。但是可以通过在DML 中使用分区扩展表或索引的名字来对应用编程,使其利用分区的优点。

可以使用SQL*Loader、Import 和Export 工具来装载或卸载分区表中的数据。这些工具都是支持分区和子分区的。

分区的方法Oracle9i 提供了如下5种分区方法:

l 范围分区Range

l 散列分区Hash

l 列表分区List

l 组合范围-散列分区Range-Hash

l 组合范围-列表分区Range-List

可对索引和表分区。全局索引只能按范围分区,但可以将其定义在任何类型的分区或非分区表上。通常全局索引比局部索引需要更多的维护。

一般组建局部索引,以便反映其基础表的结构。它与基础表是等同分区的,即它与基础

表在同样的列上分区,创建同样数量的分区或子分区,设置与基础表相对应的同样的分区边界。对局部索引而言,当维护活动影响分区时,会自动维护索引分区。这保证了索引与基础表之间的等同分区。

关于范围分区Range:

要想将行映射到基于列值范围的分区,就使用范围分区方法。当数据可以被划分成逻辑范围时如年度中的月份,这种类型的分区就有用了。当数据在整个范围中能被均等地划分时性能最好。如果靠范围的分区会由于不均等的划分而导致分区在大小上明显不同时,就需要考虑其他的分区方法。

关于散列分区Hash:

如果数据不那么容易进行范围分区,但为了性能和管理的原因又想分区时,就使用散列分区方法。散列分区提供了一种在指定数量的分区中均等地划分数据的 方法。基于分区键的散列值将行映射到分区中。创建和使用散列分区会给你提供了一种很灵活的放置数据的方法,因为你可以通过在I/O 驱动器之间播撒(摘掉)这些均等定量的分区,来影响可用性和性能。

关于列表分区List:

当你需要明确地控制如何将行映射到分区时,就使用列表分区方法。可以在每个分区的描述中为该分区列指定一列离散值,这不同于范围分区,在那里一个范 围与一个分区相关,这也不同于散列分区,在那里用户不能控制如何将行映射到分区。列表分区方法是特意为遵从离散值的模块化数据划分而设计的。范围分区或散 列分区不那么容易做到这一点。进一步说列表分区可以非常自然地将无序的和不相关的数据集进行分组和组织到一起。

与范围分区和散列分区所不同,列表分区不支持多列分区。如果要将表按列分区,那么分区键就只能由表的一个单独的列组成,然而可以用范围分区或散列分区方法进行分区的所有的列,都可以用列表分区方法进行分区。

关于组合范围-散列分区:

范围和散列技术的组合,首先对表进行范围分区,然后用散列技术对每个范围分区再次分区。给定的范围分区的所有子分区加在一起表示数据的逻辑子集。

关于组合范围-列表分区:

范围和列表技术的组合,首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。与组合范围-散列分区不同的是,每个子分区的所有内容表示数据的逻辑子集,由适当的范围和列表分区设置来描述。

创建或更改分区表时可以指定行移动子句,即ENABLE ROW MOVEMENT 或者DISABLE ROW MOVEMENT ,当其键被更改时,该子句启用或停用将行迁移到一个新的分区。默认值为DISABLE ROW MOVEMENT。本产品(项目)使用ENABLE ROW MOVEMENT子句。


分区技术能够提高数据库的可管理性:

使用分区技术,维护操作可集中于表的特定部分。例如,数据库管理员可以只对表的一部分做备份,而不必对整个表做备份。对整个数据库对象的维护操作,可以在每个分区的基础上进行,从而将维护工作分解成更容易管理的小块。

分区技术提高可管理性的一个典型用法是支持数据仓库中的‘滚动视窗’加载进程。假设数据库管理员每周向表中加载新数据。该表可以是范围分区,以便每 个分区包含一周的数据。加载进程只是简单地添加新的分区。添加一个新分区的操作比修改整个表效率高很多,因为数据库管理员不需要修改任何其他分区。从分区 后的表中去除数据也是一样。你只要用一个很简便快捷的数据字典操作删掉一个分区,而不必发出使用大量资源和调动所有要删除的数据的 ‘DELETE’ 命令。

分区技术能够提高数据库的性能:

由于减少了所检查或操作的数据数量,同时允许并行执行,Oracle9i 的分区功能提供了性能上的优势。这些性能包括:

l 分区修整:分区修整是用分区技术提高性能的最简单最有价值的手段。分区修整常常能够将查询性能提高几个数量级。例如,假定应用程序中有包含定单历史记录的 定单表,该表用周进行了分区。查询一周的定单只需访问该定单表的一个分区。如果该定单表包含两年的历史记录,这个查询只需要访问一个而不是一百零四个分 区。该查询的执行速度因为分区修整而有可能快一百倍。分区修整能与所有其他 Oracle 性能特性协作。Oracle 公司将把分区修整技术与索引技术、连结技术和并行访问方法一起联合使用。

l 分区智能联接:分区功能可以通过称为分区智能联接的技术提高多表联接的性能。当两个表要联接在一起,而且每个表都用联接关键字来分区时,就可以使用分区智 能联接。分区智能联接将大型联接分解成较小的发生在各个分区间的联接,从而用较少的时间完成全部联接。这就给串行和并行的执行都能带来显著的性能改善。

l 更新和删除的并行执行:分区功能能够无限地并行执行 UPDATE、DELETE 与 MERGE 语句。当访问分区或未分区的数据库对象时Oracle 将并行处理 SELECT 与 INSERT 语句。当不使用位图索引时,也可以对分区或未分区的数据库对象并行处理 UPDATE、DELETE 和 MERGE 语句。为了对有位图索引的对象并行处理那些操作,目标表必须先分区。这些 SQL 语句的并行执行可以大大提高性能,特别是提高 UPDATE 与 DELETE 或 MERGE 操作涉及大量数据时的性能。

分区技术提高可用性:

分区的数据库对象具有分区独立性。该分区独立性特点可能是高可用性战略的一个重要部分,例如,如果分区表的分区不能用,但该表的所有其他分区仍然保 持在线并可用。那么这个应用程序可以继续针对该分区表执行查询和事务处理,只要不是访问那个不可用的分区,数据库操作仍然能够成功运行。 数据库管理员可以指定各分区存放在不同的表空间里,从而让管理员独立于其它表分区针对每个分区进行备份与恢复操作。 还有,分区功能可以减少计划停机时间。性能由于分区功能得到了改善,使数据库管理员在相对较小的批处理窗口完成大型数据库对象的维护工作。

2009/03/11

Partition table 實作筆記 (INV的 MTL_MATERIAL_TRANSACTIONS)

摘自:網路

在 Oracle ERP 裡頭,我們發現 Inventory 的 table 有幾個很大,
以我們的環境,MTL_MATERIAL_TRANSACTIONS 大約是 14GB

因此,有沒有可能透過 partition 來檢驗這樣可以對 performance 有幫助?
如果有幫助,那這樣可以不用花費多餘的成本就能對 Database performance 作有效的控制獲改善。


在作之前,
先跟 Application Team 同事索取一段測試的 SQL statement
作為 performance 檢驗,
為了避免誤差,
我將這段 SQL 寫成 script ,放在 crontab 連續排程多次測試共 80多次,取得平均值後

整理如下:

1. explain plan 的 cost 有些微改變,但 index 的使用對象(MTL_MATERIAL_TRANSACTIONS_N8)仍不變,
這也顯示不影響原本的執行計畫

2.在 index 跟 table partition size 與分割前有滿大的空間不同
以 index MTL_MATERIAL_TRANSACTIONS_N8為例,
分割前空間為 1593MB,
經過分割跟 compress 後,各 partition 空間總和為原先的一半
1 select owner,segment_name,segment_type,extents ,bytes/1024/1024 "MB"from dba_segments
2* where segment_name like 'MTL_MATERIAL_TRANSACTIONS_N8'
SQL> /
e
OWNER SEGMENT_NAME SEGMENT_TYPE EXTENTS MB
------ -------------------------------------- ------------------ ---------- ----------
INV MTL_MATERIAL_TRANSACTIONS_N8 INDEX 1593 1593
GOBO MTL_MATERIAL_TRANSACTIONS_N8 INDEX PARTITION 33 330
GOBO MTL_MATERIAL_TRANSACTIONS_N8 INDEX PARTITION 18 180
GOBO MTL_MATERIAL_TRANSACTIONS_N8 INDEX PARTITION 21 210
GOBO MTL_MATERIAL_TRANSACTIONS_N8 INDEX PARTITION 8 80
GOBO MTL_MATERIAL_TRANSACTIONS_N8 INDEX PARTITION 1 10



3.經過三天定時排程後,將執行時間統計如下表,經過 partition 後,
執行時間約可增進 15~20%的執行效能

select partition "partition", queryrange1, queryrange2,round(avg(Run)/60,2) "Avg Mins" , count(1) "Testing Counts"
from
(select partition, queryrange1, queryrange2,60*to_number(substr(runtime,4,2)) + to_number(substr(runtime,7,2))+ to_number(substr(runtime,9,3)) Run
from inv_parti_perf_chk ) group by partition, queryrange1, queryrange2

partition QUERYRANGE1 QUERYRANGE2 Avg Mins Testing Counts
---------- -------------- -------------- ---------- --------------
n 200701 200706 8.65 5
n 200704 200705 1.99 1
n 200801 200804 4.74 9
y 200701 200706 8.74 4
y 200801 200804 4.13 7




## 建立 partition 的語法
我是把 partition 建立在另外一個 schema
如果真的要在正式環境的話,
那有個方式可以透過 rename table 的方式,
再重新建立 partition table
CREATE TABLE MY.MTL_MATERIAL_TRANSACTIONS
PARTITION BY RANGE (TRANSACTION_DATE)
(
PARTITION TRANSACTION_2005
VALUES LESS THAN ( TO_DATE('01-jan-2006','dd-mon-yyyy')) TABLESPACE GU_PARTITION_TS,
PARTITION TRANSACTION_2006
VALUES LESS THAN ( TO_DATE('01-jan-2007','dd-mon-yyyy')) TABLESPACE GU_PARTITION_TS,
PARTITION TRANSACTION_2007
VALUES LESS THAN ( TO_DATE('01-jan-2008','dd-mon-yyyy')) TABLESPACE GU_PARTITION_TS,
PARTITION TRANSACTION_2008
VALUES LESS THAN ( TO_DATE('01-jan-2009','dd-mon-yyyy')) TABLESPACE GU_PARTITION_TS,
PARTITION TRANSACTION_new
VALUES LESS THAN (MAXVALUE) TABLESPACE GU_PARTITION_TS )
as select * from inv.MTL_MATERIAL_TRANSACTIONS where 1=2;



## 建立 local index 的一例
在 global index 與 local index的選擇上,
因為 global index 還得另外 create index partition
那 local index 剛好有 key 值可以套用在 table partition
所以,我試著用 local index 並 加上 compress 參數

CREATE INDEX GOBO.MTL_MATERIAL_TRANSACTIONS_N8 ON GOBO.MTL_MATERIAL_TRANSACTIONS
(TRANSACTION_SOURCE_TYPE_ID, ORGANIZATION_ID, TRANSACTION_DATE, TRANSACTION_SOURCE_NAME)
NOLOGGING
NOLOGGING local compress;


## Gather Statistics
建立好了 partition table /index 記得跑一次 gather statistics
exec fnd_stats.gather_table_stats('MY','MTL_MATERIAL_TRANSACTIONS',granularity=>'ALL');

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