本帖最后由 syeung_001 于 2013-7-18 14:42 编辑
环境:CentOS 5.8 + Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi 物理内存:8G
SGA: MAX_SGA_SIZE=6G DB_CACHE_SIZE=4G shared_pool_size=900m large_pool_size=256m
一个实例下有三个用户(三个库,库结构:存储过程完全一样): ERP_A; ERP_B; ERP_C
写入数据的存储过程如下:
CREATE OR REPLACE PROCEDURE SP_INSERTCURRENCY
(CURR_CODE CHAR, CURR_NAME CHAR, EXCH_RATE NUMBER, TDATE DATE, CURRENCY_RKEY IN OUT NUMBER )
AS
BEGIN
INSERT INTO CURRENCY(RKEY,CURR_CODE, CURR_NAME, EXCH_RATE,TDATE)
VALUES (SEQ_CURRENCY.NEXTVAL,CURR_CODE, CURR_NAME, EXCH_RATE,TDATE);
SELECT SEQ_CURRENCY.CURRVAL INTO CURRENCY_RKEY FROM DUAL;
END;
/
Sequence SEQ_CURRENCY如下:
CREATE SEQUENCE SEQ_CURRENCY START WITH 201 CACHE 20;
问题点:
数据库运行一段时间后(大概15天) 。外部程序调用存储过程: SP_INSERTCURRENCY,执行数据插入时.有时获取sequnce.nextval不准(本例的sequence是SEQ_CURRENCY.NEXTVA),在存储过程中获取的SEQ_CURRENCY.NEXTVAL = 18. (数据表=18的记录是存在的),实际上当前值如下:
Select SEQUENCE_NAME,LAST_NUMBER from user_sequences where SEQUENCE_NAME=’SEQ_CURRENCY’
SEQUENCE_NAME LAST_NUMBER
--------------------------------------------------
SEQ_CURRENCY 201
打开一个sql/plus窗口,获取sequence也是正确的:
SQL>select SEQ_CURRENCY.NEXTVAL from dual; (值为201,正确的)
再回外部程序调用存储过程 SP_INSERTCURRENCY,获取的值还是18。真是见鬼了.
注: 清洗共享池 Alter system flush shared_pool后。外部程序调用存储过程又能正常获取nextval值了。 但一段时间后又出错了(获取sequence.nextval值错误)。
将shared_pool_size由 900m修改为 512m。一段时间后同样问题还是出现。
系统有很多类似这样的sequence。都是外部程序调用,一段时间后就出现问题