Feb 24 2009

connect by

Category: DatabaseZeeno @ 16:24

对于层级结构的数据,connect by是个非常好用的东西。今天在查询组织层次结构的时候(根据一个部门列出所有下属部门)发现里面还有个小陷阱。原始的语句如下:

SELECT pos.organization_id_child,
       pos.d_child_name,
       pos.organization_id_parent,
       pos.d_parent_name,
       LEVEL,
       sys_connect_by_path(pos.d_child_name, '/') path
  FROM per_org_structure_elements_v pos
WHERE pos.org_structure_version_id = 65 -- 注意这里
 START WITH pos.organization_id_child = 133
CONNECT BY PRIOR pos.organization_id_child = pos.organization_id_parent;

由于组织层次结构有版本控制,所以这里使用WHERE条件筛选当前的层次结构,但是结果中却出来很多同样level的重复数据。尝试换用如下SQL:

SELECT pos.organization_id_child,
       pos.d_child_name,
       pos.organization_id_parent,
       pos.d_parent_name,
       LEVEL,
       sys_connect_by_path(pos.d_child_name, '/') path
  FROM (SELECT *
          FROM per_org_structure_elements_v p
         WHERE p.org_structure_version_id = 65) pos
 START WITH pos.organization_id_child = 133
CONNECT BY PRIOR pos.organization_id_child = pos.organization_id_parent;

出来预期结果。

翻阅了《Oracle® Database SQL Reference》,没有发现语法问题。数据库版本是 Oracle9i Enterprise Edition Release 9.2.0.6.0 。


Feb 12 2009

ORA-00600: kwqidrdq: loop

Category: Database, WorkflowZeeno @ 16:51

在新克隆的应用环境中启用Workflow Deferred Agent Listener总是错误,错误信息为:

[Feb 12, 2009 3:34:45 PM CST]:1234424085866:Thread[inboundThreadGroup1,5,inboundThreadGroup]:0:-1:test.domain.com.cn:10.0.0.2:-1:-1:ERROR:[SVC-GSM-WFALSNRSVC-12681-10002 : oracle.apps.fnd.wf.bes.AgentListenerProcessor.read()]:Could not executeUpdate() on { CALL WF_EVENT.LISTEN ( p_agent_name => :1, p_wait => :2, p_correlation => :3, p_deq_condition => null, p_message_count => :4, p_max_error_count => :5 )} -> java.sql.SQLException: ORA-00600: internal error code, arguments: [kwqidrdq: loop], [0], [0], [0], [0], [], [], []
ORA-06512: at "APPS.WF_EVENT", line 1560
ORA-06512: at line 1

检查Alert,日志显示:

Thu Feb 12 16:09:55 2009
Errors in file /u08/code/dev/proddb/9.2.0/admin/DEV_test/udump/dev_ora_9675.trc:
ORA-00600: internal error code, arguments: [kwqidrdq: loop], [0], [0], [0], [0], [], [], []

通过pfiles查看9675进程,是oracleDEV,确定不是第三方程序引起的。这个错误的产生通常和AQ相关,而WF_DEFERRED正是基于AQ的,这样问题范围就缩小了。

解决步骤如下:

1. 用sysdba权限登录,停用AQ Time Managers:

alter system set aq_tm_processes = 0

2. 检查相应的QUEUE_TABLE:

SELECT * FROM applsys.aq$_wf_deferred_i i
 WHERE NOT EXISTS
 (SELECT t.msgid FROM applsys.wf_deferred t WHERE i.msgid = t.msgid);

SELECT * FROM applsys.aq$_wf_deferred_h h
 WHERE NOT EXISTS
 (SELECT t.msgid FROM applsys.wf_deferred t WHERE h.msgid = t.msgid);

SELECT * FROM applsys.aq$_wf_deferred_t ti
 WHERE NOT EXISTS
 (SELECT t.msgid FROM applsys.wf_deferred t WHERE ti.msgid = t.msgid);

如果存在记录,则删除之。

3. 重启AQ Time Managers:

alter system set aq_tm_processes = 1

问题解决。还有一种更简单的方式,就是重建QUEUE_TABLE,不过这需要在不丢失数据的前提下。

Ref Metalink: 1070715.6


Jun 05 2008

stackx

Category: DatabaseZeeno @ 08:56

Stackx (Metalink: 362791.1) 是用于分析core文件的shell脚本,可用于IBM AIX, Intel Linux (RedHat and SuSE), HP-UX (10.* and 11.*), HP Tru64 和 Sun Solaris (2.5 – 2.10)环境。

当应用程序产生错误时(比如访问禁止的内存区域)可能会被操作系统强行终止并产生core文件,里面包含程序调用的相关函数。stackx从该二进制文件中读取相关的stack trace信息,并形成可读的文本。

下面是在Solaris的示例:

######################################################################
stackx core / stack trace extraction utility
version 1.1 (c) 2005, 2006 Oracle Corp. all rights reserved.
Reporting:  Thu Jun 5 08:48:46 CST 2008
Machine  :  SunOS mytest 5.10 Generic_118833-03 sun4u sparc SUNW,Sun-Fire-V890
CPU Bits :  32
Core file:  ../core
Core date:  Jun 3 16:42
Tool(s)  :  /usr/bin/pstack /usr/bin/pmap /usr/bin/pflags
Program  :  f60webmx
Core extraction section follows
######################################################################

core '../core' of 29359:	f60webmx webfile=5,180,test_9008_MYTEST
 fef60fd8 ixncwst_WriteString (f98e78, fa6508, 0, 1, 100, f98e78) + 4
  (省略 N 字)
 000887bc main     (2, ffbfb76c, 8000, de1ff0, 64, 8) + 188
 0008860c _start   (0, 0, 0, 0, 0, 0) + dc

######################################################################
PMAP OUTPUT
core '../core' of 29359:	f60webmx webfile=5,180,test_9008_MYTEST
00010000    4032K r-x--  /u01/test/myappl/fnd/11.5.0/bin/f60webmx
  (省略 N 字)
FF3F0000       8K rwx--  /lib/ld.so.1
FFBEC000      80K rwx--    [ stack ]
 total     72264K
######################################################################
PFLAGS OUTPUT
core '../core' of 29359:	f60webmx webfile=5,180,test_9008_MYTEST
	data model = _ILP32  flags = MSACCT|MSFORK
 /1:	flags = 0
	sigmask = 0xffffbefc,0x0000ffff  cursig = SIGSEGV

######################################################################
stackx done.


Nov 15 2007

Trace Analyzer

Category: DatabaseZeeno @ 08:09

对于非技术人员来讲,做Trace也是件麻烦事,很多人不知Trace为何物,更不懂tkprof这种简单但不经培训便毫无头绪的东西。

Oracle提供一种更方便的方式,可以直接用SQL达到tkprof才能实现的功能。对于EBS用户来讲,这个工具提供更具针对性的内容。它以HTML格式输出tkprof所能提供的所有信息,更具可读性,适合对单个事务性能进行分析。

下载见Metalink: 224270.1


Oct 09 2007

Change windows hostname

Category: DatabaseZeeno @ 07:49

Step 1 – Create Hosts Entry for Old Hostname
add entry to the file WINNT\system32\drivers\etc\hosts
Step 2 – Uninstall Enterprise Manager Console
emca -deconfig dbcontrol db -repos drop
Step 3 – Stop All Oracle Services
Step 4 – Update listener.ora and tnsnames.ora
with the new Hostname
Step 5 – Rename Host and Restart
DELETE THE OLD SERVICE FROM THE REGISTRY
Step 6 – Ensure Oracle Instance is running
Step 7 – Start windows to remove Enterprise Manager service
Step 8 – Reinstall Enterprise Manager Console
emca -config dbcontrol db -repos create
Step 9 – Validate Enterprise Manager Console Installation

http://hostname:1158/em

from: DBA-Village


Sep 12 2007

ORA-14551

Category: DatabaseZeeno @ 10:15

Form中需要调用一个函数来产生单据号,却发现了这个警告:
ORA-14551:cannot perform a DML operation inside a query

原来,很多赋值语句,不是存储过程,而是一系列的SELECT语句。比如form个性化中的=my_func,实际上是

SELECT my_func INTO :MY_VAR FROM DUAL;

在SELECT时,系统会分析是否存在对表的插入、更新、修改等操作,默认是禁止此类行为的。如果必要,这时需要对函数做适当调整,加上PRAGMA AUTONOMOUS_TRANSACTION即可。如:

FUNCTION get_doc_num(p_doc_type   IN VARCHAR2,
                     p_given_date IN DATE DEFAULT SYSDATE) RETURN VARCHAR2 IS
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  ... ...
END get_doc_num;

常用的PRAGMA还有:
RESTRICT_REFERENCES
EXCEPTION_INIT
SERIALLY_REUSABLE


Next Page »