db2存储过程部署
‘壹’ DB2 DataStudio存储过程入门
建好后 看到如下界面,图中DDL部分是选择的存储过程模板
场景:
输入两个参数A和B,并求和
DDL
只需要按照模板,修改参数部分和主体部分即可
DDL的空白处,鼠标右键——》部署 或者 单击 部署 按钮
存储过程——》运行 或者 单击 运行 按钮 如图
‘贰’ db2存储过程
CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(IN FILED FILE_TYPE|OUT FIELD FIELD_TYPE|INOUT FIELD_TYPE)
BEGIN
[DECLARE I INT DEFAULT 1;]
[可以写循环:
REPEAT
UNTIL (...)
END REPEAT;
]
...
END
@
CREATE OR REPLACE PROCEDURE INSERTDATA(
IN COUNTS INT
)
BEGIN
DECLARE I INT DEFAULT 1;
REPEAT
insert into ESBTLOG(UUID, UUID_POS, MSG_ID, ESB_CODE, CLI_ID, CLI_ID_BOCS, SERV_ID, SERV_TRAN_CODE, SERV_TCODE, ESB_RET_CODE, ERR_MSG, TRACE_NO, TRAN_DATE, TRAN_TIME, TXN_STATUS, JOURNAL_NO, EXT_UUID, TXN_TOKEN, NODE_NAME, TRAN_BEGIN_TIME, TRAN_END_TIME, SP1_BEGIN_TIME, SP1_END_TIME, USER_BOCS, WKSTATION, RET_TRAN_DATE, RET_TRAN_TIME, RET_AC_DATE, RET_TRACE_NO, AP_TRACE_NO, BR_NO, TM_SMP)
values('141114B0000R', '0-0-0-0-25', '', 'BOCI060460', '520', '14', '-', '-', '000000', '2020001003', 'Send To client error.QM:CAPAQ01 QUEUE:ESB.CAP.RES.LQ1', '530000U1KQUMT', '20180730', '095310', 'E', '-', '-', '-', 'ESB.QM2', '2018-12-11-09.51.16.398765', '2018-12-11-09.51.16.398765', '2018-12-11-09.51.16.398765', '2018-12-11-09.51.16.398765', '4980261', '994', '-', '-', '-', '-', '-', '51604', '2018-12-11-09.51.16.398765');
SET I = I + 1;
UNTIL (I > COUNTS)
END REPEAT;
END
@
注意:写存储过程需要以一个符号结尾,此处用的是@符号
db2 "select * from SYSCAT.PROCEDURES where PROCNAME='INSERTDATA'"
db2 "drop procere INSERTDATA2SIPTLOG(INT,VARCHAR())"
注意:要将参数带进去
db2 -td@ -vf filename (该文件需以@符号结尾).
-td选项让命令行处理程序使用@作为语句终止字符;-v选项让命令处理程序将命令文本回显到标准输出;-f让命令行处理程序从指定文件读取命令输入
‘叁’ db2如何创建存储过程
1.首先连接数据库
2.发出一下命令:
DB2 -td@ -vf createsqlproc.DB2 createSQLproc.DB2文件中是创建存储过程的SQL语句; -td 选项让命令行处理程序使用@作为语句终止字符; -v 选项让命令处理程序将命令文本回显到标准输出; -f 让命令行处理程序从指定文件读取命令输入。
希望能解决您的问题。
‘肆’ DB2中建立存储过程的详细参数和语法
DECLARE CHOICE2 CURSOR WITH RETURN TO CALLER FOR --声明游标 CHOICE2
SELECT COMPANYID,DEPTID,SEQID,SUBMITTIME,SUBMITDATE,
B.GRADEDESC HYEAR,PRODUCTID,PRODUCTCODE,PRODUCTDESC,
A.GRADEID,PRICE,SFZDPY,LQUANT,MQUANT,MCQUANT,LCQUANT,
UQUANT,OTHQUANT1,OTHQUANT2,OTHQUANT3,OTHQUANT4,EMP1,EMP2,STATUS,A.REMARK,
DECIMAL(ABS(MCQUANT-MQUANT)/NULLIF(MQUANT,0)*100,10,2)TAG
FROM T_SUPPLY_PPB_HY A
LEFT JOIN T_SUPPLY_GRADATION B ON A.GRADEID=B.GRADEID
WHERE HYEAR=TO_CHAR(P_NF)||P_BN
ORDER BY B.GRADEID,PRODUCTCODE,A.PRICE;
--1.DECIMAL(P,S)十进制数,小数点位置由数字的精度(P)和小数位(S)确定。
-- 精度是数字的总位数,必须小于32。小数位是小数部分数字的位数且总是小于或等于精度值。
-- 如果未指定精度和小数位,则十进制值的缺省精度为5,缺省小数位为0。
--2.语法:NULLIF ( expression , expression )
-- expression:(常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组)
-- 如果两个表达式不相等,NULLIF 返回第一个 expression 的值。如果相等,NULLIF 返回第一个 expression 类型的空值。如果两个表达式相等且结果表达式为 NULL,NULLIF 等价于 CASE 的搜索函数。
‘伍’ DB2存储过程语法
http://www.51cto.com/specbook/49/3606.htm
此语句创建一个名为 gbl_temp 的用户临时表。定义此用户临时表所使用的列的名称和说明与 empltabl 的列的名称和说明完全相同。隐式定义只包括列名、数据类型、可为空特性和列缺省值属性。未定义所有其他列属性,包括唯一约束、外部关键字约束、触发器和索引。执行 COMMIT 操作时,若未对该表打开 WITH HOLD 游标,则该表中的所有数据都被删除。不记录对用户临时表所作的更改。用户临时表被放在指定的用户临时表空间中。此表空间必须存在,否则此表的声明将失败。
在上面的例子中,创建 CLP 连接后声明了一个临时表。然后创建了引用临时表的过程 p1。这里要注意的关键是,即使在过程体中没有声明临时表,该过程也被成功创建。
‘陆’ DB2 V9.7存储过程调试
CREATE PROCEDURE usp_client_insert
(
IN i_tradeSN VARCHAR(20),
IN i_scanSN VARCHAR(20),
OUT o_tradeID INT,
OUT Erro INT,
OUT Erro_msg VARCHAR(20)
)
language sql
specific SPOVERTIMEPAY
dynamic result sets 1
modifies sql data
BEGIN
DECLARE re_1 VARCHAR(20) default 'un';
declare exit handler for not found
begin
set Erro =99;
set vErro_msg = 'insert new trade record failed.';
end;
SET o_tradeID = 0;
if (i_tradeSN is null and i_scanSN is null) then
SET Erro =99;
SET Erro_msg = 'no record for insert.';
THEN SIGNAL SQLSTATE '77880' SET MESSAGE_TEXT = 'no record for insert.';
end if;
if i_tradeSN is null then
SELECT TRADEID INTO o_tradeID FROM TBLTRADES WHERE SCANSN = i_scanSN;
end if;
if i_scanSN is null then
SELECT TRADEID INTO o_tradeID FROM TBLTRADES WHERE TRADESN = i_tradeSN;
end if;
if o_tradeID = 0 then
INSERT INTO TBLTRADES (TRADESN, SCANSN, REMARKS) VALUES ( i_tradeSN,i_scanSN,re_1);
SELECT TRADEID INTO o_tradeID FROM TBLTRADES WHERE TRADESN = i_tradeSN and SCANSN = i_scanSN;
end if;
END
‘柒’ DB2怎样创建存储过程
CREATE PROCEDURE "DB2INST2"."SP_SF_GET_PRESC"
(IN "V_GHXH" BIGINT,
IN "V_RECORDSTATUS" SMALLINT,
IN "V_TYPE" SMALLINT,
IN "V_PRESCNO" BIGINT,
IN "V_ISQX" SMALLINT,
OUT "ERR_CODE" INTEGER,
OUT "ERR_TEXT" VARCHAR(100)
)
LANGUAGE SQL
NOT DETERMINISTIC
CALLED ON NULL INPUT
EXTERNAL ACTION
OLD SAVEPOINT LEVEL
MODIFIES SQL DATA
INHERIT SPECIAL REGISTERS
P1: BEGIN
DECLARE SQLCODE INT;
DECLARE V_CFQX SMALLINT;
DECLARE V_SFFYKS BIGINT;--
DECLARE V_YBDM CHAR(4);
--具体实现
END P1;
‘捌’ DB2 如何创建存储过程
这个是可以的,我在aix机子上用的代码如下:
db2 connect to ETL user ETL using ETL
db2 –td@ -vf createSQLproc.sql
你可以看看你的脚本是否有问题,如果数据库中该存储过程不存在可以直接这样写:
db2 –tvf createSQLproc.sql
还有,就是你的权限,看看你是否有权限!
‘玖’ 如何快速掌握DB2存储过程
做项目很急的话,网上搜存储过程例子,遇到问题多查官方文档或者网上搜,网上有DB2的社区,那边更专业高手也多,如果时间相对宽松,可以选择性多看看DB2的官方文档(DB2结构原理和DB2编程的)。
‘拾’ DB2存储过程
db2 -td@ -vf a.db2
这一句中@的意思是读取文件中的分隔,每遇到一个@号会将之前的SQL语句做为单独一段来执行,你的存储过程中有使用了这个符号,则执行时将创建存储过程的语句给分拆开了,所以执行会同语法错误,你这一段中只需要两个@号,第一句连接数据库后用一个,最后用一个,中间的改成“;”号。
connect to toolsdb@
CREATE PROCEDURE testProced(
in in_name varchar(20),
out out_name varchar(20)
)
LANGUAGE SQL
BEGIN
select a into out_name from bb where a1 = in_name;
END@