db2还是用dbvis 执行存储过程比较适合
很早就想学存储过程了,之前面试时都是问会不会存储过程,然而我只能摇摇头,看了大量博客,刚好这次可以用存储过程 ,会更方便一些就来搞一搞,其实和其他变成语言差不多来的。
首先说一下业务,将临时表的数据迁移到总表中,迁移过后清空临时表,并且返回参数告知应用系统是否完成存储过程。
这里只涉及到一小部分的存储过程知识:
创建存储过程,并设置参数(传入值、返回值、传入并返回的值)
create or replace producer 存储过程名 (OUT 输出参数 类型,IN 返回参数 类型,IN OUT 输入参数又已输出参数返回 类型)
代码块 --紧接着 编写存储过程 语句,要放到begin和end之间
BEGIN
巴拉巴拉
END
变量
--定义存储过程时若已经在参数处定义了就不用再定义了
DECLARE 变量名 变量类型;
--给他赋值
SET 变量名 = '';
动态sql字符串拼接并执行 --先定义一个字符串
DECLARE SQL VARCHAR(123);
DECLARE TABLE VARCHAR(22);
--用||来拼接字符串和变量
SET SQL = "SELECT * FROM "||TABLE;
--执行他
prepare S from SQL;
EXCUATE S;
事务 --在begin下还是哪里插入atomic关键字
atomic
if条件语句。 if 条件语句
巴拉巴拉;
else if 条件语句
巴拉巴拉;
end if
瞅一瞅还有什么存储过程 --注意 存储过程名的大小写
select * from syscat.procedures where procname = '存储过程名';
--然后删他一个
drop procedure '存储过程名';
注意:若是在dbvis下,要将整个存储过程用--/ 巴拉巴拉 / 包围
--/
CREATE OR REPLACE PROCEDURE "DB2ADMIN"."TEMP_TO_PERSISTENT" (OUT MAXID INTEGER,OUT MAXID1 INTEGER,OUT RES INTEGER)
-- 开启事务
-- 定义最后一个标志位
SPECIFIC SQL180521113213000
BEGIN
ATOMIC
--设置sql
declare transferSql varchar(1024);
declare transferSql1 varchar(1024);
declare delSql varchar(1024);
declare delSql1 varchar(1024);
-- 获取当时最新的id
SET MAXID = (SELECT
max(id)
FROM
trade_finance_information_temp
WHERE
timestamp(LASTUPDATETIME) < current timestamp);
SET MAXID1 = (SELECT
max(id)
FROM
trade_finance_record_temp
WHERE
timestamp(JL_TIME) < current timestamp);
IF MAXID>0
then
set transferSql = 'INSERT INTO TRADE_FINANCE_INFORMATION (
id
) SELECT
id
FROM
trade_finance_information_temp
WHERE
id <='||MAXID;
prepare s1 from transferSql;
execute s1;
set delSql = 'delete from trade_finance_information_temp where id <= '||MAXID;
prepare s2 from delSql;
execute s2;
ELSE
set MAXID = 0;
end if;
if MAXID1>0
then
set transferSql1 = 'INSERT INTO TRADE_FINANCE_RECORD (
id
) SELECT
id
FROM
trade_finance_record_temp
WHERE
id <='||MAXID1;
prepare s3 from transferSql1;
execute s3;
set delSql1 = 'delete from trade_finance_record_temp where id <= '||MAXID1;
prepare s4 from delSql1;
execute s4;
ELSE
set MAXID1 = 0;
end if;
--如果执行成功则会返回1
set res = 1;
--END后不能跟分号
END
/