db2 oracle 存储过程对比



db2 oracle 存储过程对比。

1、创建PROCEDURE的参数的区别
1)参数类型和参数名称的位置不同
db2: CREATE PROCEDURE PRO1 (IN OrgID int)
oracle:CREATE PROCEDURE PRO1 (OrgID IN int)
2)同时作为输入输出参数的写法不同
db2: CREATE PROCEDURE PRO1 (INOUT OrgID int) INOUT连着写
oracle:CREATE PROCEDURE PRO1 (OrgID IN OUT int) IN OUT中间空格隔开,而且必须IN在OUT之前
3)没有输入或输出参数时
db2: CREATE PROCEDURE PRO1 ()
oracle:CREATE PROCEDURE PRO1 不能有空的括号
4)赋值语句写法不一样
db2: set var =..
oracle: var := ..
5)异常处理不一样
db2: 异常处理器类型(handler-type)有以下几种:
CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
UNDO 在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:

NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。
SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了 SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。

以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为”ABORTED”,并且将控制流返回给调 用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
oracle: EXCEPTION
—-错误处理
WHEN DUP_VAL_ON_INDEX THEN
—-主键冲突
ROLLBACK;

WHEN VALUE_ERROR THEN
—-长度截断错误
ROLLBACK;

WHEN PROGRAM_ERROR THEN
—-PL/SQL内部错误
ROLLBACK;

WHEN TIMEOUT_ON_RESOURCE THEN
—-系统等待超时
ROLLBACK;

WHEN OTHERS THEN
—-其他异常错误
ROLLBACK;
2 自定义函数例子
类似oracle 的 to_date() 日期函数
CREATE FUNCTION DB2ADMIN.TO_DATE_EX
(INPUTDATE VARCHAR(20),
FORMAT VARCHAR(20)
)
RETURNS TIMESTAMP
SPECIFIC DB2ADMIN.SQL060801174720700
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
STATIC DISPATCH
CALLED ON NULL INPUT
EXTERNAL ACTION
INHERIT SPECIAL REGISTERS
RETURN
with tmp (outdate) as (
select
case length(rtrim(INPUTDATE))
when 10
then timestamp(inputdate || ‘ 00:00:00′)
when 19
then timestamp(inputdate)
end
from sysibm.sysdummy1 )
select outdate
from tmp;