APEX 上传xls文件
Posted on August 22, 2010 Filed Under APEX
上一篇文章介绍了APEX中上传文件的方式,以纯文本文件为例说明了如何对上传的文件进行后续处理。PL/SQL可以直接对纯文本内容进行处理,那么如果直接上传xls二进制文件呢?通常,可以用Java Procedure做这件事,但是自APEX Listener 1.x 发布后,有更简单的方式实现对xls内容的处理。
1.10 版本之后,apex-config.xml 中多了下面这个参数:
false
将该参数设置为true则开启excel到collection的转换功能,简单设置步骤如下:
1. 添加File Browse…的Page Item,名字为P1_FILENAME,Storage Type 为 WWV_FLOW_FILES
2. 添加名为UPLOAD的Button Item,Button Request 设置为 xls2collection
运行该页面,选择一个xls后缀的Excel文件,点击UPLOAD按钮即可上传该Excel文件。

上传的文件和数据分别存放在wwv_flow_files和apex_collections中。其中COLLECTION_NAME的默认名称为Page Item的名称,此例中为P1_FILENAME,C001为Excel的TAB页名称,接下来的各字段为表格内容。
SELECT * FROM apex_collections a WHERE a.collection_name = 'P1_FILENAME'
apex_collections是视图,限制了security_group_id,你需要在应用程序中,并且是当前会话中使用。
删除Collection方式为:
apex_collection.delete_collection(p_collection_name => 'P1_FILENAME');
详细说明可参考APEX 4.0的API Reference文档中的APEX_COLLECTION章节。
有了APEX Listener,很多事情变得更简单了,当然,除了文档,APEX的文档令人吃惊的简单,很多内容都没有提及。
APEX 4 中的文件上传功能
Posted on August 13, 2010 Filed Under APEX
有一个APEX小应用需要提供Excel数据上传功能,并且要对上传的数据进行后续加工处理,于是就有了下面这段有点通用的代码。
APEX 4.0中上传的存储位置有两个选择,一个是集中式的WWV_FLOW_FILES,一个是自定义的表。对于前者我不喜欢,所有应用上传的文件都存储在一个地方,有些时候管理起来不够方便;如果是自定义的表,每个应用单独存放,那么不论在迁移还是某些维护都相对简单,当然,对于上传功能的设计而言就需要多花几分钟时间了。下面是自定义表的一个例子。
1. 先创建存储表
| attach_data | blob | 二进制数据 |
| attach_mimetype | varchar2(255) | 文件类型 |
| attach_filename | varchar2(255) | 文件名 |
| attach_last_update | date | 上传时间 |
| attach_charset | varchar2(128) | 字符集 |
| attach_id | number | 文件ID |
一般而言,最好将该表最小化,包含必须的几个字段即可,如果需要和其他表关联,则可以通过ATTACH_ID关联。
2. APEX页面中增加File…上传的item,属性设置如下:

3. 添加提交表单的按钮,提交时触发一次Automatic Row Processing (DML)的Process,设置表名和主键,系统会自动将相关数据(包括上传的文件)插入对应的表中。关于主键ID的自动生成,可以在After header位置增加一个自动fetch row的设置即可。
4. 文件上传功能本身是非常简单的,接下来是针对该上传文件的后续处理。在顺序上,要先有处理上传的Process(就是第3步),然后再有后续处理的Process。手工在Page Process处再添加一个名为Parsing Attachment(名字随意)的Process,再Source处理加入匿名PL/SQL代码。例如我喜欢直接调用写好的包,那就写上:
process_upload.process_file_upload;
这里需要用户首先对Excel做一个另存问文本文件的操作,目前为止,我还没发现可以用PL/SQL来直接操作二进制Excel文件。如果有必要,可以考虑使用Java Procedure对Excel文件进行处理。
附上几段代码:
PROCEDURE process_file_upload IS
l_blob_data BLOB;
l_blob_len NUMBER;
l_position NUMBER;
l_raw_chunk RAW(2);
l_raw_line RAW(32767);
l_line VARCHAR2(32767) DEFAULT NULL;
l_array wwv_flow_global.vc_arr2;
l_first_line_flag BOOLEAN;
BEGIN
SELECT s.attach_data
INTO l_blob_data
FROM sw_detail_attachment s
WHERE s.attach_id = v('P7_ATTACH_ID');
DELETE FROM sw_detail_attachment s
WHERE s.attach_id = v('P7_ATTACH_ID');
l_blob_len := dbms_lob.getlength(l_blob_data);
l_position := 1;
l_first_line_flag := TRUE;
WHILE (l_position <= l_blob_len) LOOP
l_raw_chunk := dbms_lob.substr(l_blob_data, 1, l_position);
-- chr(10)
IF l_raw_chunk = utl_raw.cast_to_raw(chr(10)) THEN
l_line := utl_raw.cast_to_varchar2(l_raw_line);
-- remove carriage return
l_line := REPLACE(l_line, chr(13), '');
l_array := string_to_table(l_line);
IF NOT l_first_line_flag THEN
insert_data(l_array);
END IF;
l_raw_line := NULL;
l_first_line_flag := FALSE;
ELSE
l_raw_line := l_raw_line || l_raw_chunk;
END IF;
l_position := l_position + 1;
END LOOP;
END process_file_upload;
上传的文件是以TAB分割的Excel表格数据,我这里先取出文件数据放到l_blob_data中,然后针对换行符进行分割(Windows文件还需要清理掉回车符号),再对每一行使用标准函数wwv_flow_utilities.string_to_table进行解析。该函数可能存在一个问题,就是如果Excel最后一列数据为空,将导致解析后的列数缺少一列,我用下面这种方式修复该问题:
FUNCTION string_to_table(x_str IN VARCHAR2) RETURN wwv_flow_global.vc_arr2 IS
l_col_num NUMBER := 20;
l_array wwv_flow_global.vc_arr2;
BEGIN
-- CHR(9) is tab key
l_array := wwv_flow_utilities.string_to_table(x_str, chr(9));
IF l_array.count = l_col_num - 1 THEN
l_array(l_col_num) := NULL;
END IF;
RETURN l_array;
END string_to_table;
Excel数据还可以采用复制粘贴的方式直接通过表单提交上去,不过,如果Excel文件内容比较复杂,存在多个标签页,则直接上传导入Oracle数据库应该还是有相当大的需求的,如果有时间做一个配置性强的上传插件的话估计下载量会不少。
Update
APEX 4.0.1 的一个bug:如果采用非WWV_FLOW_FILES表存储上传的文件,如果用IE内核的浏览器,无法上传任何数据。
迎接变化
Posted on August 1, 2010 Filed Under Uncategorized
最近工作和生活都发生了些变化,参加新的团队,实施新的项目,也可能要投入新的ERP阵营。在企业信息化的工作经历中,我乐意了解并接触不同的产品。就像博客,保持独立性是重要的,不要把人生绑在一张船票上,也不要把企业绑在一个软件厂商上。
由于目前还处于ERP系统选型阶段,所以一切未知,一切也不便多说,但是一些通用的,依旧存在于那里。在工作变换的简短假期中有所憧憬,也有所忧虑,对之前走过的路和将来要走的路都有一些不算深入的思考。一些经验和体会零零碎碎的,整理出了下面几点:
- 对待变化不忧虑,迎接它。
- 面对现实,不逃避。
- 预估风险,面对风险,承担风险。
- 质量往往和时间成正比。
- 关键部分坦然面对。
- 不捣浆糊,有帐迟早要还的。
- 学好一门语言,其他的,可以在用到时再学——你不是程序员。
- 了解一些技术,有助于深入吃透功能本身。
- 愿意花一部分工作时间在其他需要你的地方,尽管它不属于本职工作。
- 多读官方文档。
- 沉得下去,浮得上来。
纯属个人体会和感触,不具有任何其他意义。一旦选型结束,将重新投入到实施和技术分享中来,自然会忙,会觉得辛苦,但值得。
面对变化,迎接变化。
EBS 11i升级到R12
Posted on July 5, 2010 Filed Under E-Business Suite
花了大概一周时间完成了一套11i系统(到12.1.1)的升级,之所以耗费如此多时间,简单归纳了一下大致有以下原因:
- 历史遗留的配置问题(比如用中文做关键词),此类问题导致数据转换错误。
- 客户化(索引,物化视图等)导致升级错误。
- 测试机性能差,耗时颇巨。期间多次由于内存的原因,导致java程序出错。
- 很多R12本身的升级过程中的bug需要处理。
- 部分业务数据升级时出错,可能是旧数据完整性被破坏所致。
- 一些前期工作跳过没错,这本来可以缩短升级过程的一部分排错时间。
- 其他的一些可在升级之前就预先解决的问题。
整体上说,机器的性能问题很关键,有些步骤运行动辄数个小时,有些是升级程序有优化余地而事先没有发现,这些一般都在metalink上有了解决办法。对于升级,很多人第一反应就是克隆环境升级,然后导入最新数据并进行主备切换,其实这种方案对于多数企业而言很难,因为升级过程中会修改大量的表结构,甚至很多应用级别的调整,我很怀疑有哪家公司能够做到对Oracle EBS的数据结构了解的如此洞彻明晰,至少国内没有。这是我第一次对11i进行升级,积累了一些经验,在此分享。
升级前的准备
升级前的准备包括三方面,一个是应用本身的准备工作,这个在升级手册里已经详细说明;另一个就是对服务器性能做一个充分的评估,确保整个升级过程不会跳到deadline之外;还有一个,就是将所有能提前做的工作都做好,比如invalid objects,韩语分词补丁,OLAP升级等等,这些在数据库升级阶段不是必须的,但是EBS升级时却是无法直接忽略的步骤,此外可靠的网络连接也很重要,patching过程中断线后虽然可以继续,但是光启动就要花不少时间。
升级过程中的注意事项
这里依旧按照升级步骤来进行说明。
- Disable AOL Audit Trail (conditional)
关闭所有审计功能,包括标准功能提供的,以及客户自行在DB级别上添加的。 - Shut down application tier listeners and concurrent managers (required)
- Migrate database to at least Oracle10g Release 2 (conditional)
这一步之前已经做了,考虑到停机时间,分两步走是比较合适的方案。 - Update init.ora with upgrade parameters (required)
同上,升级数据库时已经基本做好了。 - Disable custom triggers, constraints, and indexes (conditional)
注意:最好将所有直接关联到标准表的客户化索引和Materialized View都drop掉,这很可能和升级程序有冲突。比如客户化索引,很可能升级过程中就会创建同样的索引(不同名),也可能修改表结构,这些操作都可能引起错误。 - Drop MRC schema (conditional)
- Back up the database (recommended)
- Ensure that Maintenance Mode is enabled (required)
在11i环境中启用维护模式,如果数据被一些外部程序所用,则最好在升级期间停掉。 - Apply AD 12.1.1 upgrade driver (required)
先取消appltest的环境变量(.profile),然后source新的APPS_host.env,该文件在新的$APPL_TOP目录下,如apps/apps_st/appl/APPSTEST_erptest.env。
adpatch 时可能会报如下错误:ld.so.1: adpatch: fatal: .../apps/tech_st/10.1.2/lib/libclntsh.so.10.1: wrong ELF class: ELFCLASS64
原因是如下错误所导致的:
进 apps/tech_st/10.1.2/lib32 目录ls -lldflags -> /d4/R12/ab/apps/R1211XB9/apps/tech_st/10.1.2/lib/ldflags
ldflags链接到了一个不存在的文件上,这是R12本身的bug,解决办法:
$ rm $ORACLE_HOME/lib32/ldflags $ ln -s $ORACLE_HOME/lib/ldflags $ORACLE_HOME/lib32/ldflags
然后 $ORACLE_HOME/bin/genclntsh -32 重新生成libclntsh.so.10.1。
注意:$ORACLE_HOME请指向10.1.3目录,否则在Post-Upgrade还得一番折腾。 - Run the American English upgrade patch driver (required)
这一步耗时最长,问题也最多。在我的测试环境中,因为机器内存小(有两套克隆环境),patching 过程经常报java错误,需要留意检查adworkxxx.log日志,若发现错误可以尝试用adctrl去failed该job等待其重新处理即可通过。该步骤会把测试机拖得非常慢,每个adworker会带出一个java进程,占用内存非常大,所以将worker设定为一个比较小的数值会更好,比如8个,等之后运行sql等占用内存较少的步骤时,再将adworker数目调大。错误:
CREATE OR REPLACE SYNONYM APPS.CST_ACCRUAL_ACCOUNTS FOR BOM.CST_ACCRUAL_ACCOUNTS AD Worker error: The following ORACLE error: ORA-00955: name is already used by an existing object
同义词和一个视图名称一样了。这个错误很低级,我的解决办法是 DROP VIEW APPS.CST_ACCRUAL_ACCOUNTS。
错误:
A database error occurred: ORA-24816: Expanded non LONG bind data supplied after actual LONG or LOB column The error occurred while executing the following statement: INSERT INTO FND_SEED_STAGE_ENTITY (SEQ, CONFIG_ID, TOP_ENTITY_SEQ, LAST_DB_UPDATED_BY, LAST_DB_UPDATE_DATE, LAST_FILE_UPDATED_BY, LAST_FILE_UPDATE_DATE, ACTION, EXEC_STATUS, COMMIT_FLAG, BIND_VAR_METADATA, PARENT_PK_VALUE ,BIND_VALUE0 ,BIND_VALUE1 ,BIND_VALUE2 ,BIND_VALUE3 ,BIND_VALUE4 ,BIND_VALUE5 ,BIND_VALUE6,BIND_VALUE7 ,BIND_VALUE8 ,BIND_VALUE9 ,BIND_VALUE10 ,BIND_VALUE11 ,BIND_VALUE12 ,BIND_VALUE13 ,BIND_VALUE14 ,BIND_VALUE15 ,BIND_VALUE16 ,BIND_VALUE17 ,BIND_VALUE18 ,BIND_VALUE19 ,BIND_VALUE20 ,BIND_VALUE21 ,BIND_VALUE22 ,BIND_VALUE23 ,BIND_VALUE24 ,BIND_VALUE25 ,BIND_VALUE26 ,BIND_VALUE27 ,BIND_VALUE28 ,BIND_VALUE29 ,BIND_VALUE30) VALUES (:seq, :config_id, :top_entity_seq, NULL, NULL, NULL, NULL, 'IGNORE', '0', NULL, :bvar_metadata, :parent_pk_value ,:bind_value0 , :bind_value1 ,:bind_value2 ,:bind_value3 ,:bind_value4 ,:bind_value5 ,:bind_value6 ,:bind_value7 ,:bind_value8 ,:bind_value9 ,:bind_value10 ,:bind_value11 ,: bind_value12 ,:bind_value13 ,:bind_value14 ,:bind_value15 ,:bind_value16 ,:bind_value17 ,:bind_value18 ,:bind_value19 ,:bind_value20 ,:bind_value21 ,:bind_va lue22 ,:bind_value23 ,:bind_value24 ,:bind_value25 ,:bind_value26 ,:bind_value27 ,:bind_value28 ,:bind_value29 ,:bind_value30)
旧的NLS_LANG是American_America.ZHS16GBK,新的NLS_LANG是American_America.UTF8(这是rapidwiz默认赋值的),如果在安装就设置NLS_LANG和旧的一致,则不会出现问题,但是也无法转换form等编码了。
解决办法:用另一用户登录,修改NLS_LANG,手工执行fndload,然后adctrl用隐藏选项8来跳过该步骤。错误:
如果升级数据库时没有升级OLAP,则会出现一个OLAP相关的错误,此时需要升级OLAP到64位。也可以通过重建AW来解决:exec dbms_aw.execute('aw delete zpb.zpbcode') exec dbms_aw.execute('aw delete zpb.zpbdata') exec dbms_aw.execute('aw delete zpb.zpbannot') @appl_top/zpb/12.0.0/patch/115/SQL/zpbmakeaws.sqlNote:
EPB AW’s Cannot Be Attached Or Do Not Exist [ID 795247.1]错误4:
eamsnupd.sql 步骤出错,此步进行前需要预先设置好Installed Base中相关参数和配置文件。
Note:
Enterprise asset Management (EAM) Upgrade Notes to R12 – Integration and Licence [ID 884201.1]注:自R12起,IB和eAM将紧密集成。Oracle 真应当将这部分内容写到升级文档中,不了解Installed Base就尝试升级是个悲剧。
phase=A232 eamdffup.sql出错:
sqlplus -s APPS/***** @.../apps/apps_st/appl/eam/12.0.0/patch/115/sql/eamdffup.sql DECLARE * ERROR at line 1: ORA-06501: PL/SQL: program error ORA-06512: at "APPS.FND_FLEX_DSC_API", line 1626 ORA-06501: PL/SQL: program error ORA-06512: at "APPS.FND_FLEX_DSC_API", line 298 ORA-01403: no data found ORA-06512: at line 177
仔细检查问题sql,发现由以下数据引起的:
SELECT * FROM fnd_descr_flex_contexts_tl f WHERE f.application_id = 426 AND f.descriptive_flex_context_code IN ('PE', 'PG');解决办法:将弹性域名称从中文(能源计量:电能/能源计量:气体)修改为英文。
phase=A250 apilnupg.sql有严重的性能问题,1天都跑不完
解决办法:create index AP_INVOICE_DISTRIBUTIONS_N25 on AP_INVOICE_DISTRIBUTIONS_ALL(PARENT_REVERSAL_ID);
Note:
R12 : Performance Issue While Runing apilnupg.sql (Upgrade to 12.1.1) [ID 942694.1]phase=A260 appdstln.sql 报错
sqlplus -s APPS/***** @.../apps/apps_st/appl/ap/12.0.0/patch/115/sql/appdstln.sql &un_ap &batchsize 7 16 DECLARE * ERROR at line 1: ORA-01400: cannot insert NULL into ("AP"."AP_PAYMENT_HIST_DISTS"."INVOICE_DISTRIBUTION_ID") ORA-06512: at line 38解决办法:修改AP_PAYMENT_HIST_DISTS.INVOICE_DISTRIBUTION_ID 和 AP_PAYMENT_HIST_DISTS.AMOUNT 允许为空,找到那些为空的数据查明原因。正式环境升级时应当避免该情况发生。
注:这其实不是真正意义上的“解决”办法,关键是找到哪些数据有问题,为什么有问题。phase=A322 csxruprf.sql 报错
sqlplus -s APPS/***** @.../apps/apps_st/appl/cs/12.0.0/patch/115/sql/csxruprf.sql DECLARE * ERROR at line 1: ORA-20002: ORA-20001: -28102-ORA-28102: policy does not exist. ORA-06512: at line 146
解决办法:
SELECT nvl(sr_agent_security, 'XXXX') FROM cs_system_options;
如果查询结果为ANONE,那么它认为已经创建policy,此处只需要生效即可,而实际上系统中并未存在这些policy。通过手工执行相关sql,并跳过该job继续。
phase=A327 FNDFFVGN 报错
.../apps/apps_st/appl/fnd/12.0.0/bin/FNDFFVGN &ui_apps 0 Y 2 401 'MTLL' 'MTL_ITEM_LOCATIONS_KFV' 'Y' Log filename : .../apps/apps_st/appl/admin/TEST/log/l9017672.req Report filename : .../apps/apps_st/appl/admin/TEST/out/o9017672.out Segmentation Fault - core dumped AD Worker error: The above program failed with error code -117. See the AD Worker log file and/or the program log file for details.
解决办法:这个只是编译弹性域,可以跳过该步骤,应用起来后重新编译弹性域。
- Run the NLS upgrade patch driver (conditional)
- Apply latest product patches (required)
- Synchronize NLS and American English product patches (conditional)
- Disable Maintenance Mode (required)
- Reset init.ora parameters (required)
数据库升级时已经做了 - Back up Oracle E-Business Suite (recommended)
- 出错
FRM-30064: Unable to parse statement select upet.type_name EPC_type_name, upec.name category_name, upet.type_id, upec.category_id
from mgd_idencoding_category upec,
mgd_idencoding_type upet
where upec.category_id = upet.category_id
and ((NVl(upet.partition_value,0)= 0 and upet.category_id = 1 ) or upet.category_id <> 1)
order by upec.category_id,type_name.
ORA-00942: table or view does not exist
Record Group EPC_RULE_RG
Form: WMSLABEL
FRM-30085: Unable to adjust form for output.
解决办法:这个用不到,当作成功继续下一步。
- 出错
.../apps/tech_st/10.1.2/bin/rwconverter userid=APPS/***** source=.../apps/apps_st/appl/xtr/12.0.0/reports/ZHS/XTRTMBLT.rdf dest=.../apps/apps_st/appl/admin/TEST/out/tmp001.rdf stype=rdffile dtype=rdffile overwrite=yes batch=yes compile_all=yes ld.so.1: rwconverter: fatal: librw.so: open failed: No such file or directory Killed ERROR [code=-119] generating report "XTRTMBLT.rdf" from input file .../apps/apps_st/appl/xtr/12.0.0/reports/ZHS/XTRTMBLT.rdf
是编译rdf的程序有问题,参考文档:
On R12.1.1/Solaris Platform , Generating Oracle Reports Files failed on : " ld.so.1: rwconverter: fatal: librw.so: open failed: No such file or directory", How to get a Potential quick Solution ?. [ID 1067786.1]
标准功能的升级并不难,虽然中途有很多问题,但是整体上没有多大难度(事实上这世界上的事情只有烦的,没有难的)。最耗精力和时间的,估计反而是那些凌乱的客户化应用。在ERP项目实施过程中,虽然每个人都知道文档的重要性,但是数年下来,回过头来整理时,往往会发现很多文档消失不见,或者有文档但是形同于无。这些是应用升级后需要耗费时间的地方。
对于客户化应用的升级,没有标准答案。
EBS 11i数据库升级(9i->10g)几点事项
Posted on June 9, 2010 Filed Under Database, E-Business Suite
最近几日在评估和测试EBS的系统升级(11i升级到R12),虽然官方的升级文档里介绍的比较详细了,但是依旧会出现一些容易疏忽的问题,这里做一些记录。这里并不是单纯的数据库升级,需要考虑EBS的特殊应用。对于升级方案,标准的有三种:
- 同时升级数据库和应用。
- 先升级数据库到10gR2,然后升级应用到R12。
- 先升级数据库到11gR2,然后升级应用到R12。
其中第2和第3种方案有点类似,都是将整个升级方案划分为两个阶段,只是数据库版本不同。实际上,从技术上看,第1种方案也是两步走,只是在应用层跳过一些过渡性的补丁直接升级到R12。
在数据库升级方面,升级路线主要有下面两种:
- 路线1: 9.2.0.6 -> 9.2.0.8 -> 11.2.0.1
如果是Solaris系统,则要求系统版本至少为 Solaris 10 Update 6。 - 路线2: 9.2.0.6 -> 10.2.0.1 -> 10.2.0.4
注:最新patchset是10.2.0.5,只是升级文档依旧停留在10.2.0.4。
从一般认识上讲,Oracle数据库在下一个大版本出来后,上一个版本才被认为是相对更稳定的,所以此处选择第二条路线。
数据库升级方式简单而言有以下几种:
- DBUA,直接通过图形化工具升级,这个最简单。
- Manual,类似于上一种方式,只是手工进行各个步骤的升级操作。
- Export/Import
有利于数据表的整理,重构数据库,比如修改字符集、数据文件、表空间参数等,在升级时间上,比DBUA和Manual两种方式都要长。 - 利用数据复制等技术,升级备用环境后再切换。
由于允许停机,并且暂无特殊的要求,所以这里使用DBUA做升级操作。
在升级之前,建议卸载statspack,并且先解决Invalid Objects的问题。此外,数据库升级后DBLINK需要重建,所以先准备相关重建脚本。下面按照文档步骤升级数据库9.2.0.6 至 10.2.0.4,每个步骤都列在下面,对几个步骤中需要额外关注的地方做了备注。
- Verify software versions
检查现在软件版本,基本上应该不会有问题的,留意一下AD版本,最新版本是11i.AD.I.7,不过要求11i.AD.I.6就可以了。 - Migrate to Oracle Portal 10g (conditional)
- Deregister the current database server (conditional)
- Update application tier context file with new database listener port number (conditional)
- Export OLAP analytical workspaces (conditional)
- Prepare to create the 10.2.0 Oracle home
设置ORACLE_HOME环境变量,如 export ORACLE_HOME=/u08/test/proddb/10.2.0 - Install the base 10.2.0 software
安装10gR2软件,不要选择升级现有数据库,因为要先打一些补丁。这个过程最后会写oraclehomproperties.xml,要保证对应目录有可写权限。比如我曾遭遇了这个错误
inventory/ContentsXML/oraclehomproperties.xml (Permission denied). - Install Oracle Database 10g Products from the 10g Companion CD
- Perform 10.2.0.4 patch set pre-installation tasks
这是正常的打数据库补丁操作,留意几个环境变量的修改就可以了。如:export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/perl/bin:$PATH export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export PERL5LIB=$ORACLE_HOME/perl/lib:$ORACLE_HOME/perl/lib/site_perl:$PERL5LIB
- Perform 10.2.0.4 patch set installation tasks
- Create nls/data/9idata directory
- Apply additional 10.2.0.4 RDBMS patches
- Shut down Applications server processes and database listener
- Prepare to upgrade
- Upgrade the database instance
执行utlu102i.sql查看升级后的变动情况,然后执行DBMS_STATS.GATHER_SCHEMA_STATS 收集统计数据以加快升级速度。在升级的时候如果没有列出所需的ORACLE_HOME,则需要检查并整理一下oratab。 - Modify initialization parameters
对于sga_target等参数,最好先计算以下之前的SGA大小再设置,其余的参考文档设置即可。 - Additional database configuration
- Perform 10.2.0.4 patch set post-installation tasks
- Install Oracle Data Mining and OLAP
- Natively compile PL/SQL code (optional)
- Fix Korean lexers
升级韩语分词,对于简体中文用户不必进行。
注意:如果将来需要升级EBS至R12,则这一步是必须的,否则升级过程中会出错:Uploading from staging tables Error loading seed data for CS_KB_SOLN_CATEGORIES_VL: CATEGORY_ID = 1, ORA-29877: failed in the execution of the ODCIINDEXUPDATE routine ORA-20000: Oracle Text error: DRG-50857: oracle error in textindexmethods.ODCIIndexUpdate ORA-20000: Oracle Text error: DRG-10602: failed to queue DML change to column for primary key DRG-13201: KOREAN_LEXER is desupported ORA-30576: ConText Option dictionary loading error
- Import OLAP analytical workspaces (conditional)
同上,如果将来需要升级EBS至R12,则这一步是必须的,稍微不同的时,到时可以不必做“升级”操作,而是直接删除重建:exec dbms_aw.execute('aw delete zpb.zpbcode'); exec dbms_aw.execute('aw delete zpb.zpbdata'); exec dbms_aw.execute('aw delete zpb.zpbannot'); sqlplus '/ as sysdba' @$APPL_TOP/zpb/12.0.0/patch/115/SQL/zpbmakeaws.sql - Start the new database listener (conditional)
- Run adgrants.sql (conditional)
- Grant create procedure privilege on CTXSYS
- Implement and run AutoConfig
先检查TNS_ADMIN变量是否指向新的路径,并检查listener.ora,看SID_LIST_TEST中是否已经添加了相应的SID,netca创建的listener.ora可能会缺少这个信息。
这里尤其需要留意的是,adbldxml.pl 创建配置文件后,如果做adconfig.pl会报错:Can't locate object method "runPipedCmd" via package "ADX::util::Sysutil" at /u08/test/proddb/10.2.0/appsutil/bin/adconfig.pl line 806.
这是由于PERL5LIB没有包含新的appsutil中的perl lib所致,手工加上再执行就可以了。
afdbprf.sh 这一步还会报错:ORA-12504: TNS:listener was not given the SID in CONNECT_DATA
手工执行可以通过,可能是afdbprf.sh 中传递变量有问题。
- Gather statistics for SYS schema
dbms_stats.gather_schema_stats这一步没有问题,但是执行dbms_stats.gather_fixed_objects_stats时会报错:declare * ERROR at line 1: ORA-00600: internal error code, arguments: [1350], [1], [13], [], [], [], [], [] ORA-06512: at "SYS.DBMS_STATS", line 13210 ORA-06512: at "SYS.DBMS_STATS", line 13517 ORA-06512: at "SYS.DBMS_STATS", line 14039 ORA-06512: at line 3 ORA-06512: at line 33
这应该是个BUG,据说在11gR2中被修复了。
- Re-create custom database links (conditional)
升级之前就已经准备好了DBLINK的重建脚本,直接重建即可。 - Re-create grants and synonyms
- Apply Oracle Receivables patch
- Restart Applications server processes (conditional)
按标准步骤做完后,数据库成功升级到10.2.0.4,升级后需要留意以下事项:
- 检查 .profile ,使用使用新的环境变量。
- 如果有快速启动脚本之类的,看是否指向了新的路径。
- 检查AutoConfig新创建的env文件,看PATH变量是否正确,删除指向旧数据库的路径。
- 用adadmin重新生成messages并编译包,否则Web页面登录可能会报错:
oracle.apps.fnd.framework.OAException: Application: FND, Message Name: FND_GENERIC_MESSAGE. Tokens: MESSAGE = java.sql.SQLException: ORA-00003: Message 3 not found; product=RDBMS; facility=ORA ORA-06512: ? "SYS.DBMS_UTILITY", line 70 ORA-06512: ? line 1
- 最好转换SYSTEM表空间到Local Management。
主要参考文档
Database Preparation Guidelines for an E-Business Suite Release 12.1.1 Upgrade [ID 761570.1]
Oracle Applications Release 11i with Oracle 10g Release 2 (10.2.0) [ID 362203.1]
关闭功能顾问的那些诊断模式
Posted on May 28, 2010 Filed Under E-Business Suite
相对于SAP而言,Oracle ERP的另一个显著特征或许就是大量的BUG和补丁吧,也或许正因为如此,Oracle ERP中的故障诊断越来越便捷,方式也越来越,有Server级的诊断(如Form Server),有DB级的诊断,也有功能级的诊断(输出程序步骤和关键业务数据)。对于Form/Report Server之类的故障诊断,通常有专门的技术顾问负责,多数情况下,功能顾问在Oracle Support的建议下也会进行各种形式的、针对各个模块和功能的诊断,有的记录在表里,有的形成日志文件,也有的直接显示在页面上。对于不影响用户操作的诊断,事后很容易就忘记了关闭,于是大量的五花八门的被遗弃的debug和trace偷偷占用着宝贵的系统资源。
通常,功能顾问们涉及的诊断功能可直接通过配置文件启用,主要有下面这些:
- FND:启用调试日志 启用日志。如果为否 (‘N’),则运行时不会进行记录和发出预警。
- OE:调试 选择“是”以激活 Oracle 订单分录管理系统表单用户退出和并发程序中的调试信息
- OE:调试跟踪 选择“是”以激活 oracle 订单分录管理系统并发程序的跟踪输出
- OSO:启用调试消息 用于显示/隐藏调试消息的 Sales Online 配置文件
- PA:调试模式 指明是否按调试模式运行项目会计管理系统报表和流程;在调试模式下运行时,线索会被打开,附加信息会打印至日志文件
- PO:将调试工作流设置为“打开” 启用/禁用 PO 工作流调试模式
- PO:启用对接收处理程序的 SQL 跟踪 启用数据库 SQL 跟踪,以便调试接收事务处理程序。
- RCV:调试模式 如果将此模式设置为“是”,则将在日志文件中打印消息。
- 初始化 SQL 语句 – 自定义 初始化会话的自定义 SQL 语句
其中“初始化 SQL 语句 – 自定义”比较特殊,可以自行设置event。它的格式如:
BEGIN fnd_ctl.fnd_sess_ctl('','','','TRUE','','ALTER SESSION SET TRACEFILE_IDENTIFIER=' || '''' ||'4269824.999' || '''' || ' EVENTS =' || '''' ||' 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12 ' || '''');END;
其实就相当于每次开启会话时自动执行了类似如下的命令:
alter session set events='10046 trace name context forever, level 12' ;
用下面的SQL可以查询到各个级别的配置文件设置情况:
SELECT n.user_profile_option_name NAME,
to_char(v.last_update_date, 'yyyy-mm-dd') "Last Updated",
decode(v.level_id,
10001,
'Site',
10002,
'Application',
10003,
'Responsibility',
10004,
'User',
10005,
'Server',
10007,
'SERVRESP',
'UnDef') level_set,
decode(to_char(v.level_id),
'10001',
'',
'10002',
app.application_short_name,
'10003',
rsp.responsibility_key,
'10005',
svr.node_name,
'10006',
org.name,
'10004',
usr.user_name,
'10007',
'Serv/resp',
'UnDef') "CONTEXT",
v.profile_option_value VALUE
FROM fnd_profile_options p,
fnd_profile_option_values v,
fnd_profile_options_vl n,
fnd_user usr,
fnd_application app,
fnd_responsibility rsp,
fnd_nodes svr,
hr_operating_units org
WHERE p.profile_option_id = v.profile_option_id(+)
AND p.profile_option_name = n.profile_option_name
AND usr.user_id(+) = v.level_value
AND v.level_id = 10004 -- User
AND rsp.application_id(+) = v.level_value_application_id
AND rsp.responsibility_id(+) = v.level_value
AND app.application_id(+) = v.level_value
AND svr.node_id(+) = v.level_value
AND org.organization_id(+) = v.level_value
ORDER BY n.user_profile_option_name,
level_set;
对于懒人们,不妨做成自动预警,每周末检查一次就可以了。
