O***T 发帖数: 124 | 1 我现在有一个很简单的stored procedure in db2
create or replace procedure P_1()
begin
insert into table_A ( column1,column2)
select a,b
from table_b;
end;
为了防止这个procedure fail(比如table_b不存在之类的情况...),我想放一个error
handler在这个statement里面,我不在乎到底是什么error,只要上面那个Insert
statement fail了(或者说这个sp fail了?),就往另外一个table添加一条类似Log
的记录Insert into table_c (column1,column2) values (P_1,current date)
想请教各位大牛这个code我该怎么写,从来没写过error handler的东西,网上查了很
久,仍旧是一片雾水,连应该放在这个insert statement前面还是后面还是专门写一个
error handler的sp都没想明白。
另外,因为工作关系,现在开始接触DB2,不知道大家有什么好书可以推荐,最好能涵
盖怎么在DB2写stored procedure, function, cursor的内容。
先谢谢大家了 |
l******b 发帖数: 39 | 2 u can use
EXCEPTION WHEN OTHERS
THEN
-- ur error logging or handling
-- statements here
// when others handler is a catch-all
// handler.
error
Log
【在 O***T 的大作中提到】 : 我现在有一个很简单的stored procedure in db2 : create or replace procedure P_1() : begin : insert into table_A ( column1,column2) : select a,b : from table_b; : end; : 为了防止这个procedure fail(比如table_b不存在之类的情况...),我想放一个error : handler在这个statement里面,我不在乎到底是什么error,只要上面那个Insert : statement fail了(或者说这个sp fail了?),就往另外一个table添加一条类似Log
|
O***T 发帖数: 124 | 3 谢谢,好像exception只可以用在oracle?
【在 l******b 的大作中提到】 : u can use : EXCEPTION WHEN OTHERS : THEN : -- ur error logging or handling : -- statements here : // when others handler is a catch-all : // handler. : : error : Log
|
l******b 发帖数: 39 | 4
PL/SQL (Procedural Language/Structured Query Language) statements can be
compiled and executed using DB2® interfaces. This support reduces the
complexity of enabling existing PL/SQL solutions so that they will work with
the DB2 data server.
http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com
【在 O***T 的大作中提到】 : 谢谢,好像exception只可以用在oracle?
|
O***T 发帖数: 124 | 5 哦,这样啊,太谢谢了
with
【在 l******b 的大作中提到】 : : PL/SQL (Procedural Language/Structured Query Language) statements can be : compiled and executed using DB2® interfaces. This support reduces the : complexity of enabling existing PL/SQL solutions so that they will work with : the DB2 data server. : http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com
|
s**********o 发帖数: 14359 | 6 难道不能用个
IF EXISTS SELECT TOP 1 FROM table_b
BEGIN
INSERT
END
ELSE
BEGIN
INSERT into log
END |
l******b 发帖数: 39 | 7
从逻辑上说好像是这样子, 但他说的好像是需要exception handling吧?
T-SQL如何handle exception?
【在 s**********o 的大作中提到】 : 难道不能用个 : IF EXISTS SELECT TOP 1 FROM table_b : BEGIN : INSERT : END : ELSE : BEGIN : INSERT into log : END
|
l******b 发帖数: 39 | 8
我以前也不知道DB2可以支持PLSQL, 其实还有GreenPlum
和Postgre 可以用plpgSQL, 基本上和PLSQL大同小异.
在服务器端, plsql是很不错的一种语言.
【在 O***T 的大作中提到】 : 哦,这样啊,太谢谢了 : : with
|
s**********o 发帖数: 14359 | 9 TSQL是这样的
BEGIN TRANSACTION
BEGIN TRY
// do your SQL statements here
COMMIT TRANSACTION
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
ROLLBACK TRANSACTION
END CATCH |
l******b 发帖数: 39 | 10
Thanks
【在 s**********o 的大作中提到】 : TSQL是这样的 : BEGIN TRANSACTION : BEGIN TRY : // do your SQL statements here : COMMIT TRANSACTION : END TRY : BEGIN CATCH : SELECT : ERROR_NUMBER() AS ErrorNumber, : ERROR_SEVERITY() AS ErrorSeverity,
|
s**********o 发帖数: 14359 | 11 TSQL毕竟只是MANIPULATE数据的,如果SCHEMA有问题,
或者被改了,一般不用ERROR HANDLE的,直接让STORED PROC
出错,出错了你才知道TABLE被改了或者不存在,否则
谁也不会看那个LOGFILE,数据可能几个月都没LOAD起来
你才发现问题
【在 l******b 的大作中提到】 : : Thanks
|
O***T 发帖数: 124 | 12 因为可能还有其他的error存在, 所以想用error handler来处理各种可能的sp
failures.
现在的构想是想用VBA call 这个sp,放在access里给其他人用,一旦sp fail了,
access可以跳出一个窗口,告诉他们程序没有运行成功,但是他们不用知道具体的
error是什么。
【在 s**********o 的大作中提到】 : 难道不能用个 : IF EXISTS SELECT TOP 1 FROM table_b : BEGIN : INSERT : END : ELSE : BEGIN : INSERT into log : END
|
O***T 发帖数: 124 | 13 谢谢,学习了
【在 s**********o 的大作中提到】 : TSQL是这样的 : BEGIN TRANSACTION : BEGIN TRY : // do your SQL statements here : COMMIT TRANSACTION : END TRY : BEGIN CATCH : SELECT : ERROR_NUMBER() AS ErrorNumber, : ERROR_SEVERITY() AS ErrorSeverity,
|