如何查看ORACLE的异常记录日志??

解决方案 »

  1.   

    怎么样查看,主要还是看里面有没有错误信息了。ORACLE的异常日志,一般在ORACLE_BASE/admin/SID/bdump/alert_<SID>.ora(win).如果是linux是ORACLE_BASE/admin/SID/bdump/alert<SID>.ora
      

  2.   

    我在A库加了一个PUBLIC的DBLINK连接B库,DBLINK中有一个别名指向B的一个PACKAGE,在A库调用B那个包里的一个存储过程。结果传入一组参数得到的返回值,与在B库直接调用这个存储过程得到的返回值不一样,这组参数在B中可以正常返回,A远程DBLINK过去就返回异常值,求教
      

  3.   

    就是找不到报的什么错,两边都是WINDOW系统
      

  4.   

    你是sqlplus里调用,还是procedure里调用,还是应用程序里调用。如果有异常,应该有个异常的提示吧,是什么提示。
      

  5.   

     PROCEDURE BossSsfGrjf(
            yhbh_v        t_yhxx.yhbh%TYPE,            --用户编号
            jkje_v        t_dsjl.je%TYPE,            --缴款金额
            je_v            t_dsjl.je%TYPE,            --欠费金额
            fphm_v        t_ssjl.fphm%TYPE,            --发票号码
            qssj_v        DATE,                            --起始时间
            jzsj_v        DATE,                            --截止时间
            bz_v            VARCHAR2,                    --收费备注
            jsrbh_v        s_czry.rybh%TYPE,            --经手人员编号
            sfjg_v        t_ssjl.sfjg%TYPE,            --收费机构
            anetuser_v    t_ssjl.czy%TYPE,                    --操作员代码
            fhz             OUT NUMBER)                --返回值
            
        AS
            zhye_v        t_yhxx.zhye%TYPE;            --用户帐户余额
            je_v1            t_dsjl.je%TYPE;            --用户在该段时间内应缴纳的金额
            je_v2            t_dsjl.je%TYPE;            --中心待收表中的欠费金额
            qssj_v2        DATE;                            --起始时间
            jzsj_v2        DATE;                            --截止时间
            je_v3            t_dsjl.je%TYPE;            --前置机待收表中的欠费金额
            qssj_v3        DATE;                            --起始时间
            jzsj_v3        DATE;                            --截止时间
            dkjf_v        t_yhxx.dkjf%TYPE;            --代扣缴费
            lsbl            NUMBER;                        --临时变量
            cwndsxsj_v    DATE;                            --财务年度生效时间
            dwbh_v1        s_dwxx.dwbh%TYPE;            --用户所在单位编号
            dwbh_v2        s_dwxx.dwbh%TYPE;            --使用该发票号码的单位编号
        BEGIN
            
            --取本财务年度的生效时间
            SELECT COUNT(*) INTO lsbl FROM s_cwnd;
            IF lsbl>0 THEN
                --如果财务年度表中有存在记录,则取最大财务年度的生效时间
                SELECT sxsj INTO cwndsxsj_v FROM s_cwnd
                    WHERE cwnd=(SELECT MAX(cwnd) FROM s_cwnd);
            ELSE
                --如果财务年度表中不存在记录,则默认财务年度生效时间为2000年1月1日
                cwndsxsj_v:=TO_DATE('20000101','yyyymmdd');
            END IF;
            --取用户帐户余额
            SELECT zhye,dkjf INTO zhye_v,dkjf_v FROM t_yhxx WHERE yhbh=yhbh_v;
            --判断缴款与欠费金额的关系
            IF jkje_v+zhye_v<je_v THEN
                fhz:=-60514;
                RETURN;
            END IF;
            --如果发票号码不为0000000,则判断该发票是否已经被使用
            IF fphm_v<>'0000000' THEN
                --查询该发票是否已经被使用(对单笔业务来讲,发票是不能重用的)
                --注意财务年度的区别(只判断本财务年度)
                IF Init.IfInvoiceUsed(fphm_v,2,jsrbh_v)<>0 THEN
                    --该发票已经被使用
                    fhz:=-60513;
                    RETURN;
                END IF;
                --判断发票是否是该用户拥有的
                --未销号表没有必要判断财务年度,这是因为财务年度结转时把未销号表清空了
                --当前未销号表中的记录一定是本财务年度的
                fhz:=-60518;
                SELECT COUNT(*) INTO lsbl FROM t_wxhfp
                    WHERE pldh=2 AND jsr=jsrbh_v AND
                        TO_NUMBER(fphm_v) BETWEEN TO_NUMBER(qsph) AND TO_NUMBER(mwph);
                IF lsbl=0 THEN
                    --当前经手人不拥有该发票的使用权
                    fhz:=-60517;
                    RETURN;
                END IF;
            END IF;
            --对于没有欠费的用户,可以缴纳费用,在过帐后直接转入该用户的帐户余额
            IF je_v=0 THEN
                --增加余额收费记录
                fhz:=-60516;
                INSERT INTO t_yejl(yhbh,je,jsr,hdr,sfsj,gzqk,czsj,bz)
                    VALUES(yhbh_v,jkje_v,jsrbh_v,NULL,SYSDATE,0,SYSDATE,bz_v);
                COMMIT;
                fhz:=0;
                RETURN;
            END IF;
            --如果该用户没有签订代扣缴费协议,则执行下面的操作
            IF dkjf_v=0 THEN
                --取中心表中待收记录的起始时间、截止时间和待收金额
                SELECT MIN(qssj),MAX(jzsj),SUM(je) INTO qssj_v2,jzsj_v2,je_v2
                    FROM t_dsjl WHERE yhbh=yhbh_v AND je>0;
                --取前置机表中待收记录的起始时间、截止时间和待收金额
                SELECT MIN(qssj),MAX(jzsj),SUM(je) INTO qssj_v3,jzsj_v3,je_v3
                    FROM t_dsjl@qzj WHERE yhbh=yhbh_v AND je>0;
                --如果上面两组值相等,则认为前置机的待收数据和中心完全相同,否则不能处理
                IF NOT (TO_CHAR(qssj_v2,'yyyymmdd')=TO_CHAR(qssj_v3,'yyyymmdd')
                            AND TO_CHAR(jzsj_v2,'yyyymmdd')=TO_CHAR(jzsj_v3,'yyyymmdd')
                            AND je_v2=je_v3) THEN
                    fhz:=-60507;
                    RETURN;
                END IF;
            ELSE
                --如果该用户已经签订了代扣协议,则从代扣表中查询代扣记录,
                --同时,该记录必须还没有要求代扣(即:yqdk=0)
                fhz:=-60515;
                SELECT MIN(qssj),MAX(jzsj),SUM(je) INTO qssj_v2,jzsj_v2,je_v2
                    FROM t_dkjl@qzj WHERE yhbh=yhbh_v AND je>0 AND yqdk=0;
            END IF;
            --取该用户的第一条记录的截止时间
            fhz:=-60501;
            SELECT MIN(jzsj) INTO jzsj_v2 FROM t_dsjl
                WHERE yhbh=yhbh_v AND je>0 AND
                    TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v,'yyyymmdd');
            IF TO_CHAR(jzsj_v2,'yyyymmdd')<=TO_CHAR(jzsj_v,'yyyymmdd') THEN
                --如果有多条待收记录
                qssj_v2:=qssj_v;
                --计算该用户在指定时间内需要缴纳多少金额
                je_v1:=GetYhSsf(yhbh_v,qssj_v,jzsj_v);
                IF je_v1=0 THEN
                    fhz:=-60512;
                    RETURN;
                END IF;
                --判断待缴金额和需缴金额是否相同
                IF je_v=je_v1 THEN
                    WHILE TO_CHAR(jzsj_v2,'yyyymmdd')<=TO_CHAR(jzsj_v,'yyyymmdd') LOOP
                        --删除中心表中的待收记录
                        DELETE FROM t_dsjl
                            WHERE yhbh=yhbh_v AND je>0 AND
                                TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v2,'yyyymmdd') AND
                                    TO_CHAR(jzsj,'yyyymmdd')=TO_CHAR(jzsj_v2,'yyyymmdd');
                        --删除前置机表中的待收记录
                        DELETE FROM t_dsjl@qzj
                            WHERE yhbh=yhbh_v AND je>0 AND
                                TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v2,'yyyymmdd') AND
                                    TO_CHAR(jzsj,'yyyymmdd')=TO_CHAR(jzsj_v2,'yyyymmdd');
                        qssj_v2:=jzsj_v2+1;
                        SELECT COUNT(*) INTO lsbl FROM t_dsjl
                            WHERE yhbh=yhbh_v AND je>0 AND
                                TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v2,'yyyymmdd');
                        IF lsbl>0 THEN
                            SELECT jzsj INTO jzsj_v2 FROM t_dsjl
                                WHERE yhbh=yhbh_v AND je>0 AND
                                    TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v2,'yyyymmdd');
                        ELSE
                            EXIT;
                        END IF;
                    END LOOP;
                    --处理最后一段收视费
                    IF TO_CHAR(jzsj_v2,'yyyymmdd')>TO_CHAR(jzsj_v,'yyyymmdd') THEN
                        --如果待缴金额和需缴金额相同,则更新中心待收记录中的起始时间和待收金额
                        --je_v2是待收金额总和
                        fhz:=-60504;
                        UPDATE t_dsjl SET qssj=jzsj_v+1,je=je_v2-je_v
                            WHERE yhbh=yhbh_v AND je>0 AND
                                TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v2,'yyyymmdd') AND
                                    TO_CHAR(jzsj,'yyyymmdd')=TO_CHAR(jzsj_v2,'yyyymmdd');
                        --更新前置机待收记录中的起始时间和待收金额
                        fhz:=-60508;
                        UPDATE t_dsjl@qzj SET qssj=jzsj_v+1,je=je_v2-je_v
                            WHERE yhbh=yhbh_v AND je>0 AND
                                TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v2,'yyyymmdd') AND
                                    TO_CHAR(jzsj,'yyyymmdd')=TO_CHAR(jzsj_v2,'yyyymmdd');
                    END IF;
                    --在收视记录表中增加收视记录
                    --收费机构(1--窗口2--银行3--收费组,4--历史数据)
                    --收费记录是否打印(0--未打印1--已打印需统计2--已打印不统计)
                     fhz:=-60509;
                    INSERT INTO t_ssjl(yhbh,je,fphm,qssj,jzsj,jsr,hdr,sfsj,sfjg,czy,czsj,jldy,bz)
                       VALUES(yhbh_v,je_v,fphm_v,qssj_v,jzsj_v,jsrbh_v,NULL,SYSDATE,sfjg_v,anetuser_v,SYSDATE,0,bz_v);
                       
                ELSE
                    --如果待缴金额和需缴金额不同,返回错误信息
                    fhz:=-60505;
                    ROLLBACK;
                    RETURN;
                END IF;
            ELSE
                --jzsj_v2>jzsj_v
                --计算该用户在指定时间内需要缴纳多少金额
                je_v1:=GetYhSsf(yhbh_v,qssj_v,jzsj_v);
                --判断待缴金额和需缴金额是否相同
                IF je_v=je_v1 THEN
                    --如果待缴金额和需缴金额相同,则更新中心待收记录中的起始时间和待收金额
                    fhz:=-60504;
                    UPDATE t_dsjl SET qssj=jzsj_v+1,je=je-je_v
                        WHERE yhbh=yhbh_v AND je>0 AND
                            TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v,'yyyymmdd') AND
                                TO_CHAR(jzsj,'yyyymmdd')=TO_CHAR(jzsj_v2,'yyyymmdd');
                    --更新前置机待收记录中的起始时间和待收金额
                    fhz:=-60508;
                    UPDATE t_dsjl@qzj SET qssj=jzsj_v+1,je=je-je_v
                        WHERE yhbh=yhbh_v AND je>0 AND
                            TO_CHAR(qssj,'yyyymmdd')=TO_CHAR(qssj_v,'yyyymmdd') AND
                                TO_CHAR(jzsj,'yyyymmdd')=TO_CHAR(jzsj_v2,'yyyymmdd');
                    --在收视记录表中增加收视记录
                    --收费机构(1--窗口2--银行3--收费组,4--历史数据)
                    --收费记录是否打印(0--未打印1--已打印需统计2--已打印不统计)
         
                    fhz:=-60509;
                       INSERT INTO t_ssjl(yhbh,je,fphm,qssj,jzsj,jsr,hdr,sfsj,sfjg,czy,czsj,jldy,bz)
                        VALUES(yhbh_v,je_v,fphm_v,qssj_v,jzsj_v,jsrbh_v,NULL,SYSDATE,sfjg_v,anetuser_v,SYSDATE,0,bz_v);
                     commit;
                ELSE
                    --如果待缴金额和需缴金额不同,返回错误信息
                    fhz:=-60505;
                    ROLLBACK;
                    RETURN;
                END IF;
            END IF;
            --如果缴款金额大于欠费金额,则生成余额缴费记录
            IF jkje_v-je_v>0 THEN
                --增加余额收费记录
                fhz:=-60516;
                INSERT INTO t_yejl(yhbh,je,jsr,hdr,sfsj,gzqk,czsj,bz)
                    VALUES(yhbh_v,jkje_v-je_v,jsrbh_v,NULL,SYSDATE,0,SYSDATE,bz_v);
            END IF;
            COMMIT;
            fhz:=0;
        EXCEPTION
            WHEN no_data_found THEN
                ROLLBACK;
                RETURN;
            WHEN OTHERS THEN
                IF fhz>=0 THEN
                    fhz:=-60500;
                END IF;
                ROLLBACK;
                RETURN;
        END BossSsfGrjf;在A库的PL/SQL里,在JDBC里,在A库的procedure里调用得到的返回值都是-60509,在B库的PL/SQL里procedure里都得到0正常COMMIT数据
      

  6.   

    在java里执行成功了没有,后台有没有exception出来,太长的过程了,-60509是你的逻辑代码之一吧。  根据对程序的浏览,感觉如果是-60509这个code的话,应该只有可能紧接着的commit和下面最后一个COMMIT;可能有问题。你把exception raise出来 看看有什么样的信息。 
      

  7.   

    把下面的代码暂时删除一下,应该会抛出异常信息
      EXCEPTION
       WHEN no_data_found THEN
       ROLLBACK;
       RETURN;
       WHEN OTHERS THEN
       IF fhz>=0 THEN
       fhz:=-60500;
       END IF;
       ROLLBACK;
       RETURN;