是否可以知道行号。 oracle或SQL Server存储过程中发生错误的位置?
答案 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;