【发布时间】: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 的示例数据?