EVENT ADJUST_SCN 说明 [30681.1]

在一篇文章中引用了ID 为[30681.1] 的文档,刚才去MOS 上查,居然没有了,原来MOS 有时也靠不住。 在google 上展转了一下,找到了这篇文章。贴过来,备用。

DocID: Note:30681.1

Subject: EVENT: ADJUST_SCN - Quick Reference

Type: REFERENCE

Status: PUBLISHED

Content Type:TEXT/PLAIN

CreationDate: 20-OCT-1997

LastRevision Date: 04-AUG-2000

Language: USAENG

ADJUST_SCNEvent

~~~~~~~~~~~~~~~~

***WARNING ***

This event should only ever be used underthe guidance

of an experienced Oracle analyst.

If an SCN is ahead of the current databaseSCN, this indicates

some form of database corruption. Thedatabase should be rebuilt

after bumping the SCN.

****************

The ADJUST_SCN event is useful in somerecovery situations where the

current SCN needs to be incremented by alarge value to ensure it

isahead of the highest SCN in the database. This is typically

required if either:

a. An ORA-600 [2662] error is signalledagainst database blocks

or

b. ORA-1555 errors keep occuring afterforcing the database open

or ORA-604 / ORA-1555 errors occurduring database open.

(Note: If startup reports ORA-704& ORA-1555 errors together

then the ADJUST_SCN eventcannot be used to bump the

SCN as the error is occuringduring bootstrap.

Repeated startup/shutdown attemptsmay help if the SCN

mismatch is small)

or

c. If a database has been forced openused _ALLOW_RESETLOGS_CORRUPTION

(See<Parameter:Allow_Resetlogs_Corruption> )

The ADJUST_SCN event acts as describedbelow.

**NOTE: You can check that the ADJUST_SCNevent has fired as it

should write a message to the alert log inthe form

"Debugging event used to advance scn to %s".

If this message is NOT present in the alert log the event

has probably not fired.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If the database will NOT open:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Take a backup.

You can use event 10015 to trigger anADJUST_SCN on database open:

startup mount;

alter session set events '10015 tracename adjust_scn level 1';

(NB: You can only use IMMEDIATE here onan OPEN database. If the

database is only mounted use the 10015 trigger to adjust SCN,

otherwise you get ORA 600 [2251], [65535], [4294967295] )

alter database open;

If you get an ORA 600:2256 shutdown, usea higher level and reopen.

Do *NOT* set this event in init.ora or theinstance will crash as soon

as SMON or PMON try to do any clean up.Always use it with the

"alter session" command.

~~~~~~~~~~~~~~~~~~~~~~~~~~

If the database *IS* OPEN:

~~~~~~~~~~~~~~~~~~~~~~~~~~

You can increase the SCN thus:

alter session set events 'IMMEDIATEtrace name ADJUST_SCN level 1';

LEVEL:Level 1 is usually sufficient - it raises the SCN to 1 billion

(1024*1024*1024)

Level 2 raises it to 2 billion etc...

If you try to raise the SCN to a level LESS THAN or EQUAL to its

current setting you will get <OERI:2256> - See below.

Ie: The event steps the SCN to known levels. You cannot use

the same level twice.

Calculating a Level from 600 errors:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To get a LEVEL for ADJUST_SCN:

a) Determine the TARGET scn:

ora-600 [2662] See <OERI:2662> Use TARGET >= blocks SCN

ora-600 [2256] See<OERI:2256> Use TARGET >=Current SCN

b)Multiply the TARGET wrap number by 4. This will give you the level

to use in the adjust_scn to get the correct wrap number.

c) Next, add the following value to thelevel to get the desired base

value as well :

Add to Level Base

~~~~~~~~~~~~ ~~~~~~~~~~~~

0 0

1 1073741824

2 2147483648

3 3221225472

-------------------------------------------------------------------------------------------------------

Blog: http://blog.youkuaiyun.com/tianlesoftware

Email: dvd.dba@gmail.com

DBA1 群:62697716(满); DBA2 群:62697977(满)DBA3 群:62697850(满)

DBA 超级群:63306533(满); DBA4 群: 83829929 DBA5群: 142216823

DBA6 群:158654907 聊天 群:40132017 聊天2群:69087192

--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

PROCEDURE PROC_SETT_ADJUST_CHECK(P_ID IN t_Settlement_adjust.Id_t_Settlement_Adjust%TYPE, P_STATUS IN VARCHAR2) IS cursor cur_get_adjust_info is select * from t_settlement_adjust a where a.id_t_settlement_adjust = P_ID; cursor cur_old_charge_info(c_charge_id number) is select * from t_gls_commision_fee a where a.charge_id = c_charge_id; cursor cur_old_fee_info(c_charge_id number) is select * from t_agency_commision_fee a where a.related_id = c_charge_id; r_get_adjust_info cur_get_adjust_info%ROWTYPE; r_charge_info cur_old_charge_info%ROWTYPE; r_fee_info cur_old_fee_info%ROWTYPE; v_charge_id t_gls_commision_fee.charge_id%TYPE; v_old_charge_id t_gls_commision_fee.charge_id%TYPE; v_fee_amount t_gls_commision_fee.fee_amount%TYPE; BEGIN update t_settlement_adjust a set a.status = P_STATUS where a.id_t_settlement_adjust = P_ID; IF P_STATUS = '2' THEN return; else open cur_get_adjust_info; fetch cur_get_adjust_info into r_get_adjust_info; open cur_old_charge_info(r_get_adjust_info.charge_id); fetch cur_old_charge_info into r_charge_info; select S_AGENCY_COMM_CHARGE__ID.NEXTVAL into v_charge_id from dual; --调整需要对冲,追加不需要 if r_get_adjust_info.alter_type = '2' then v_old_charge_id := r_charge_info.charge_id; r_charge_info.charge_id := v_charge_id; r_charge_info.policy_year := r_get_adjust_info.policy_year; r_charge_info.commision_type := r_get_adjust_info.alter_type; v_fee_amount := r_charge_info.fee_amount; r_charge_info.fee_amount := -v_fee_amount; r_charge_info.commision := -r_charge_info.commision; r_charge_info.fee_status := 0; r_charge_info.policy_period := r_get_adjust_info.policy_period; r_charge_info.adjust_charge_id := r_get_adjust_info.charge_id; insert into t_gls_commision_fee values r_charge_info; --处理财务数据 open cur_old_fee_info(v_old_charge_id); fetch cur_old_fee_info into r_fee_info; r_fee_info.agency_fee_id := S_AGENCY_COMM_FEE__ID.NEXTVAL; r_fee_info.money := -r_fee_info.money; r_fee_info.related_id := v_charge_id; r_fee_info.finish_time := sysdate; r_fee_info.insert_time := sysdate; r_fee_info.update_time := sysdate; r_fee_info.posted := 'N'; r_fee_info.policy_year := r_get_adjust_info.policy_year; r_fee_info.policy_period := r_get_adjust_info.policy_period; insert into t_agency_commision_fee values r_fee_info; close cur_old_fee_info; end if; if r_get_adjust_info.adjust_rate != 0 then v_old_charge_id := nvl(v_old_charge_id, r_charge_info.charge_id); select S_AGENCY_COMM_CHARGE__ID.NEXTVAL into v_charge_id from dual; r_charge_info.charge_id := v_charge_id; r_charge_info.policy_year := r_get_adjust_info.policy_year; r_charge_info.commision_type := r_get_adjust_info.alter_type; r_charge_info.rate := r_get_adjust_info.adjust_rate; r_charge_info.fee_amount := nvl(v_fee_amount, r_charge_info.fee_amount); r_charge_info.commision := round(nvl(v_fee_amount, r_charge_info.fee_amount) * r_get_adjust_info.adjust_rate, 2); r_charge_info.fee_status := 0; r_charge_info.policy_period := r_get_adjust_info.policy_period; r_charge_info.adjust_charge_id := r_get_adjust_info.charge_id; insert into t_gls_commision_fee values r_charge_info; open cur_old_fee_info(v_old_charge_id); fetch cur_old_fee_info into r_fee_info; r_fee_info.agency_fee_id := S_AGENCY_COMM_FEE__ID.NEXTVAL; r_fee_info.money := round(nvl(v_fee_amount, r_charge_info.fee_amount) * r_get_adjust_info.adjust_rate, 2); r_fee_info.related_id := v_charge_id; r_fee_info.finish_time := sysdate; r_fee_info.insert_time := sysdate; r_fee_info.update_time := sysdate; r_fee_info.posted := 'N'; r_fee_info.policy_year := r_get_adjust_info.policy_year; r_fee_info.policy_period := r_get_adjust_info.policy_period; insert into t_agency_commision_fee values r_fee_info; close cur_old_fee_info; end if; close cur_old_charge_info; close cur_get_adjust_info; END IF; exception when others then ROLLBACK; update t_settlement_adjust a set a.status = '3' where a.id_t_settlement_adjust = P_ID; END PROC_SETT_ADJUST_CHECK; r_get_adjust_info.adjust_rate是要存rate和计算commision、money的100倍,应该怎么修改代码
最新发布
10-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值