Oracle存储过程中的错误处理

时间:2011-03-23 20:15:04

标签: sql-server oracle

是否可以知道行号。 oracle或SQL Server存储过程中发生错误的位置?

4 个答案:

答案 0 :(得分:4)

在Oracle中,您可以使用 DBMS_UTILITY.FORMAT_ERROR_STACK获取错误堆栈和 DBMS_UTILITY.FORMAT_CALL_STACK获取调用堆栈。 两者都返回一个varchar2(2000)。 这个用法的一个很好的例子是Dan Morgans图书馆http://psoug.org/reference/exception_handling.html。 有很多可用信息,其中包含行号。

答案 1 :(得分:1)

在SQL Server中,您可以捕获错误的所有属性。

BEGIN TRY
    -- Generate a divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

http://msdn.microsoft.com/en-us/library/ms175976.aspx

更好的是,创建一个错误表和一个存储过程以将这些值插入表中。然后在catch块中执行存储过程。

答案 2 :(得分:0)

对于SQL Server,当您从SQL Server Management Studio运行proc时,它将在消息选项卡中为您提供该行

例如,如果你有这个proc

CREATE PROCEDURE prTest
AS
SELECT 1

SELECT 2

SELECT bla FROM SOMETABLE


SELECT 3

GO

你就像这样运行

EXEC prTest

您收到此错误消息

  

Msg 208,Level 16,State 1,Procedure
  prTest,第7行无效的对象名称   'SOMETABLE'。

答案 3 :(得分:0)

在您的程序中,您需要捕获异常。您甚至可以将异常发送到错误日志表。这有多有趣!或者,你可以只是DBMS_OUTPUT消息,但它可能很长。 DBMS_OUTPUT对邮件大小有限制。默认值为20000个字符。

您甚至可以创建自定义exceptions

您首先需要一个变量

EM VARCHAR(2000);

然后在你的程序结束时这样做。

      EXCEPTION WHEN OTHERS THEN
      EM := substr(SQLERRM, 1, 2000) ;
      ROLLBACK;
      INSERT INTO ERROR_LOG(ERROR_TIME, PROC_NAME , ERROR_MSG)
      VALUES(SYSTIMESTAMP , 'PKG.get_stuff', EM);
      COMMIT;
      RETURN NULL;