Stored Procedure(存储过程)编写经验和优化措施
2007-11-11 08:01:05 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

核心提示: 如何在SQL存储过程中处理错误下面将如何在存储过程中判断SQL语句的错误,向大家作一个详细地介绍, 希望大家让程序开发人员遵从这样的方式编写SQL存储过程,Stored Procedure(存储过程)编写经验和优化措施(5),以避免造成在程序联调过程中应用程序状态不明确的问题,如以下代码表示,跳出存储过程,也可以定义
如何在SQL存储过程中处理错误
下面将如何在存储过程中判断SQL语句的错误,向大家作一个详细地介绍, 希望大家让程序开发人员遵从这样的方式编写SQL存储过程,以避免造成在程序联调过程中应用程序状态不明确的问题。
如以下代码表示,在SQL存储过程中可以定义执行状态的出口参数,而且尽量返回系统报告的SQLCODE, 而并非个人定义的,这样可以更好地判断是什么样的错误, 也可以返回错误说明,有的开发人员不知何故,将返回码定义成79700,如果是参照DB2说明开发的,可能是误会了说明的含义,这个问题已经造成了联调过程中的误导判断和无法确定问题的原因,希望大家注意;
如果需要忽略NOT FOUND, 可以DECLARE CONTINUE HANDLER FOR NOT FOUND, 如果需要并且可以将returnCode设置为零,以便于在程序体内判断returnCode的时候可以忽略这个NOT FOUND;
可以定义DECLARE EXIT HANDLER FOR SQLEXCEPTION, 当出现SQL错误的时候,中断程序执行过程,跳出存储过程,也可以定义DECLARE CONTINUE HANDLER FOR SQLEXCEPTION, 同时判断SQLCODE的值,用以忽略你希望忽略的error code, 在程式的最后列出了这种使用方式:
CREATE PROCEDURE OUT_LANGUAGE (...,OUT returnCode INTEGER, OUT returnMsg CHAR(32))
-- returnCode 返回执行中的的错误代码
-- returnMsg 返回执行中的的错误描述
SPECIFIC SQL_OUT_LANGUAGE
LANGUAGE SQL
BEGIN
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE errorLabel CHAR(32) DEFAULT '';
......
-- in case of no data found
DECLARE CONTINUE HANDLER FOR NOT FOUND
BEGIN
SET returnCode = SQLCODE;
-- 也可以设置为 SET returnCode = 0; 因为这个DECLARE是为了忽略NOT FOUND的执行结果
END;
-- in case of SQL error
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END;
......
对于SQLEXCEPTION也可以这样定义,用来忽略一些特定的error code, 但是要在程序体内判断returnCode的数值:
-- in case of SQL error
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
IF (SQLCODE = -454) THEN
SET returnCode = 0;
-- 创建的数据库对象已经存在或者插入的记录在唯一键值上重复
ELSE
SET returnCode = SQLCODE;
SET returnMsg = errorLabel;
END IF;
END;
......
IF (returnCode = 0) THEN
......
END IF;
IF (returnCode = 0) THEN
...
END IF;
END
--存储过程结束
更多精彩
赞助商链接