发了RAISE_APPLICATION_ERROR的例外时,错误号被设置为-20000。同时你可以加上对该
问题的错误描述。描述信息中可以使用存储在AD_Message表中的信息,只要将它的值放在@之间。也可以将多个字符串连接在一起。
例外块中必须能够区分两种不同情况:存储过程是被应用程序直接调用还是被其他存储过程调用的。通常这可以通过AD_PInstance_ID是否为NULL来区分。
如果是由其他存储过程调用时引发的例外是由存在于AD_PInstance中的父存储过程处理的。但是这不适用于以上介绍的中介存储过程。因为中介存储过程中没有处理例外的块,所以还是由相应的AD_PInstance_ID的主存储过程来处理。在RAISE 之前可以使用DBMS_OUTPUT.PUT_LINE()用于调试。下面是被另外一个存储过程调用的存储过程中的例个块的例子:
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR MA_Standard_Cost_Sequence, sequence_ID '|| p_Sequence_ID || ', date ' || p_CalcDate || ' at ' ||v_ResultStr);
RAISE;
END Ma_Standard_Cost_Sequence;
如果存在AD_PInstance时例外必须要在AD_PInstance表中设置对应的信息。这条信息是由@ERROR=SQLERRM组成的,SQLERRM中是在RAISE_APPLICATION_ERROR或数据库抛出的的例外中的错误信息。然后是调用ROLLBACK,最后在AD_PInstance中更新错误信息并返回结果为0、显示错误信息的对话框。同时也可以使用DBMS_OUTPUT.PUT_LINE()用于测试。
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
v_ResultStr:= '@ERROR=' || SQLERRM;
DBMS_OUTPUT.PUT_LINE(v_ResultStr) ;
ROLLBACK;
AD_UPDATE_PINSTANCE(p_PInstance_ID, NULL, 'N', 0, v_ResultStr) ;
RETURN;
END MA_ProductionRun_Standard;
存储过程语法的建议
Openbravo支持Oracle和PostgreSQL数据库。
以下的一些建议可以使你的存储过程能同时在这两个数据库上运行或能够很容易的转换。这里假设你已经为Oracle与了代码但同时想让这些代码能在PostgreSQL上运行。
通用规则
以下一些内容能确保PL代码能正确地在其他数据库后台运行。
JOIN语句。用LEFT JOIN或RIGHT JOIN代替(+)
在XSQL中使用问号(?)作为参数据占位符。如果参数时数值型使用TO_NUMBER(?),日期型使用TO_DATE(?)。
不要使用GOTO语句,因为PostgreSQL不支持GOTO。
使用COALESCE代替NVL
使用CASE代替DECODE。如果CASE 表达式为NULL,如:
CASE WHEN variable IS NULL THEN X ELSE Y END
如果变量的值是几个字符串连接起来的要用括号括起来
用NOW()代替SYSDATE
PostgreSQL区分""和NULL,在检查空变量的时候要注意这一点
使用子
查询时要加上别名。
SELECT * FROM (SELECT 'X' FROM DUAL) A
使用SELECT语句时总是使用AS
SELECT field AS field_name FROM DUAL
PostgreSQL中UPATE,INSERT,和DELETE语句中不支持别名。
PostgreSQL8.1不支持这样的UPDATE语句(但8.2已支持了)
UPDATE TABLE_NAME SET (A,B,C) = (SELECT X, Y, Z FROM ..
但下面的语句是可以的:
UPDATE TABLE_NAME SET A = (SELECT X FROM ..), B = (SELECT Y FROM .),C = (SELECT Z F