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
/