Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures 过程中的PL/SQL异常处理_Stored Procedures_Exception Handling_Plsql - Fatal编程技术网

Stored procedures 过程中的PL/SQL异常处理

Stored procedures 过程中的PL/SQL异常处理,stored-procedures,exception-handling,plsql,Stored Procedures,Exception Handling,Plsql,这是一个关于最佳实践的问题。我有一个类似于此的PL/SQL块 DECLARE --work variables PROCEDURE p1(in_parameter1, out_parameter1, out_parameter2...) IS BEGIN --do stuff --select ( ... ) into ( ... ) from t1 where ( ... ) END; PROCEDURE p

这是一个关于最佳实践的问题。我有一个类似于此的PL/SQL块

DECLARE

    --work variables

    PROCEDURE p1(in_parameter1, out_parameter1, out_parameter2...) IS
    BEGIN    
        --do stuff
        --select ( ... ) into ( ... ) from t1 where ( ... )
    END;

    PROCEDURE p2(in_parameter1, out_parameter1, out_parameter2...) IS
    BEGIN 
        --do stuff
        --insert/update tables
        --do more stuff
    END;    

BEGIN -- MAIN PROCESS STARTS HERE

    open c1;
    fetch c1 into c1RowData;
    EXIT WHEN c1%NOTFOUND    
     --call procedure1
     --do stuff
     --call procedure2
     --do stuff
     --do stuff
     --call procedure1
     --call procedure2
END;
/
EXIT;
过程p1和p2中的语句可能会引发异常:未找到数据、索引上的DUP VAL等


您认为处理此异常的最佳方法是什么?它们是应该在过程内部处理,还是您认为我应该在主体中用TRY-CATCH块围绕每个调用过程?

最好在过程内部处理异常。很快就会有结果。不仅如此,如果我们在其他函数中重用相同的过程,我们也不需要处理异常。我认为,异常可以在程序本身内部处理是最好的

最好在过程内部处理异常。很快就会有结果。不仅如此,如果我们在其他函数中重用相同的过程,我们也不需要处理异常。我认为,异常可以在程序本身内部处理是最好的

就我个人而言,我会在他们被扔出的程序中抓住他们。这意味着您对如何从外部处理它们有更多的控制。例如,您可以将它们作为用户定义的异常再次抛出,您可以使用有关到底是什么出错的更多信息来修饰它们

'Failed to find a matching row in table a for value b'
在程序之外的描述要比

'no data found'
但这实际上取决于:

调用应用程序的错误报告要求 在过程中“做事情”的地方实现的实际功能 例如,假设您希望运行过程2,即使过程1中的select未找到任何行。。您需要捕获过程1中的异常并忽略它。如果没有,那么它将被抛出到过程2中的异常处理程序

或者,假设您希望过程1在select没有找到任何内容的情况下插入一行,在这种情况下,您需要捕获异常并在异常处理程序中执行插入


现在,在任何人攻击我之前,我不建议您使用异常处理程序来控制代码中的执行流,这些示例是理论上的,但希望您能理解..

我个人会在抛出它们的过程中捕捉到它们。这意味着您对如何从外部处理它们有更多的控制。例如,您可以将它们作为用户定义的异常再次抛出,您可以使用有关到底是什么出错的更多信息来修饰它们

'Failed to find a matching row in table a for value b'
在程序之外的描述要比

'no data found'
但这实际上取决于:

调用应用程序的错误报告要求 在过程中“做事情”的地方实现的实际功能 例如,假设您希望运行过程2,即使过程1中的select未找到任何行。。您需要捕获过程1中的异常并忽略它。如果没有,那么它将被抛出到过程2中的异常处理程序

或者,假设您希望过程1在select没有找到任何内容的情况下插入一行,在这种情况下,您需要捕获异常并在异常处理程序中执行插入


现在,在任何人攻击我之前,我不建议您使用异常处理程序来控制代码中的执行流,这些示例是理论上的,但希望您能理解..

您应该尝试在源代码处(即在引发异常的过程中)处理异常。这为报告问题发生的位置提供了更大的范围,并且通常有更大的机会能够优雅地纠正问题,而无需向用户传递讨厌的Oracle错误消息

当然,如果确实需要,您可以处理错误并重新引发它,但正如StevieG回答的那样,您还可以引发用户定义的异常,这些异常通常更特定于应用程序,并且对您的用户/其他PL/SQL代码更有帮助

这里有一个关于自定义错误处理的ASKTOM讨论:

您应该尝试在源位置处理异常,即在引发异常的过程中处理异常。这为报告问题发生的位置提供了更大的范围,并且通常有更大的机会能够优雅地纠正问题,而无需向用户传递讨厌的Oracle错误消息

当然,如果确实需要,您可以处理错误并重新引发它,但正如StevieG回答的那样,您还可以引发用户定义的异常,这些异常通常更特定于应用程序,并且对您的用户/其他PL/SQL代码更有帮助

这里有一个关于自定义错误处理的ASKTOM讨论:

谢谢!你说这取决于实际实现的函数性。。在程序范围内。你能详细说明一下吗。在什么情况下最好在过程之外处理异常?谢谢!你说它是
取决于实际实现的功能性。。在程序范围内。你能详细说明一下吗。在哪些情况下,最好在过程之外处理异常?您能否解释如何快速生成异常?您能否解释如何快速生成异常?