【问题标题】:SQL Exception block gets entered though it shouldn't尽管不应该输入 SQL 异常块
【发布时间】:2018-08-15 19:51:39
【问题描述】:

我在 SQL 中有一个过程,我从输入列表中读取并插入到表中并返回相同类型的列表,其中包含在插入数据时出现异常的所有记录入表。 下面是代码:

CREATE OR REPLACE PROCEDURE TEST(i_EXTRACTION_TYPE_LIST IN EXTRACTION_TYPE_LIST, o_EXTRACTION_TYPE_LIST OUT EXTRACTION_TYPE_LIST) AS 

BEGIN

  FOR i in 1..i_EXTRACTION_TYPE_LIST.COUNT
    LOOP
      BEGIN
         For Process_Name In(
      Select P.Extt_Process_sid, P.Execute_For_Sub_Portfolio_Ind From Extt_Process P 
      Where 
      P.Extt_Acc_Region_Cd=i_EXTRACTION_TYPE_LIST(i).Extt_Acc_Region_Cd And 
      P.Extt_Time_Period_View_Cd=i_EXTRACTION_TYPE_LIST(i).Extt_Time_Period_View_Cd
      )
        Loop
        BEGIN
        If (i_EXTRACTION_TYPE_LIST(i).extt_SubPortfolio_Ind = 'Y' And Process_Name.Execute_For_Sub_Portfolio_Ind = 'N') = FALSE Then
          Insert Into Extt_Process_Execution Pe(
            Pe.Extt_Process_Exec_Sid,
            Pe.Extt_Process_sid, 
            Pe.Extt_Process_Exec_Start_Ts,
            Pe.Extt_Portfolio_Id,
            Pe.Extt_Process_Exec_Status_Cd,
            Pe.Report_From_Dt,
            Pe.Report_To_Dt,
            Pe.Created_By_Id,
            Pe.Created_Ts,
            UPDATED_BY_ID,
            UPDATED_TS)
            Values(
            Apex_De_Seq.Nextval,
            Process_name.extt_process_sid,
            i_EXTRACTION_TYPE_LIST(i).Extt_Process_Exec_Start_Ts,
            i_EXTRACTION_TYPE_LIST(i).Extt_Portfolio_Id,
            i_EXTRACTION_TYPE_LIST(i).Extt_Process_Exec_Status_Cd,
            i_EXTRACTION_TYPE_LIST(i).Report_From_Dt,
            i_EXTRACTION_TYPE_LIST(i).Report_To_Dt,
            user,
            Systimestamp,
            user,
            Systimestamp
            );

        END IF;
        EXCEPTION
            WHEN others then

            IF o_EXTRACTION_TYPE_LIST IS NULL THEN
            o_EXTRACTION_TYPE_LIST:=EXTRACTION_TYPE_LIST(i_EXTRACTION_TYPE_LIST(i));

            ELSE

          o_EXTRACTION_TYPE_LIST.extend();

          o_EXTRACTION_TYPE_LIST(o_EXTRACTION_TYPE_LIST.count):=i_EXTRACTION_TYPE_LIST(i);
          END IF;
          DBMS_OUTPUT.PUT_LINE(o_EXTRACTION_TYPE_LIST.count);
        END;
        End Loop;
      END;
      END LOOP;
END TEST;

尽管我插入的记录是完美的并且不会导致任何异常,但 DBMS 的输出为 1。我相信我处理异常或块范围的方式搞砸了。请帮忙!

【问题讨论】:

  • 如果删除 EXCEPTION WHEN 子块会发生什么?那么它会抛出异常吗?
  • 不,它没有。应该没有例外。我写了异常块以防万一出现异常,它应该优雅地处理它。
  • 参数o_EXTRACTION_TYPE_LIST的作用是什么?您的异常块只会捕获有关表列验证(类型,长度)的错误。我想,当没有数据要插入时,你不想捕获异常?顺便说一句,您的插入语句可以很容易地写在一个“插入到..选择”结构中 - 也就是说,您可以将您的集合放在表格(集合)形式中并将其视为表格。
  • 对于解决方案,您能否提供一些带有场景(预期最终结果)和类型 DDL 的示例数据?

标签: sql oracle exception


【解决方案1】:

你说你不应该进入你的异常块,但你是,所以一定有某种异常发生。将dbms_output.put_line(sqlerrm) 添加到您的异常块以确定发生了什么。关于哪里出了问题,有太多的可能性可以推测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多