[英]Stored procedure, if exists return ID or insert and return ID
我有一個非常簡單的DB2存儲過程,我在其中存儲參數字符串並將其插入表中,這很好用,但我確實需要對其進行擴展。 當前看起來像這樣:
IN_TAG_DATA
P1 : BEGIN ATOMIC
INSERT INTO SCHEMA.TAGS(TAG_DATA)
VALUES(IN_TAG_DATA);
END P1
我現在需要做的是將相同的字符串參數放入,但是基於該參數,我需要檢查名稱是否已經存在,如果存在,請選擇/返回其ID。 如果不存在,則需要插入它,然后返回創建的ID。
我應該如何改變它以獲得適當的功能?
IN_TAG_DATA
OUT_TAG_ID
P1 : BEGIN ATOMIC
DECLARE V_TAG_ID INTEGER;
SELECT CAST(NEXT VALUE FOR SCHEMA . TAG_ID_SEQ AS INTEGER)
INTO V_TAG_ID
FROM SYSIBM . SYSDUMMY1;
/*
IF EXISTS BASED ON IN_TAG_DATA, GET ID ELSE INSERT AND RETURN created ID
*/
SET OUT_TAG_ID
END P1
--#SET TERMINATOR @
CREATE TABLE TAGS(TAG_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY, TAG_DATA VARCHAR(20) NOT NULL) IN USERSPACE1@
CREATE OR REPLACE PROCEDURE TAGS(P_TAG_DATA VARCHAR(20), OUT P_TAG_ID INT)
BEGIN
FOR C1 AS
WITH E (TAG_ID) AS (
SELECT TAG_ID
FROM TAGS
WHERE TAG_DATA=P_TAG_DATA
)
, I AS (
SELECT TAG_ID
FROM NEW TABLE (
INSERT INTO TAGS (TAG_DATA)
SELECT P_TAG_DATA FROM TABLE(VALUES 1)
WHERE NOT EXISTS (SELECT 1 FROM E)
)
)
SELECT COALESCE(E.TAG_ID, I.TAG_ID) TAG_ID
FROM I FULL JOIN E ON 1=1
DO
SET P_TAG_ID = C1.TAG_ID;
END FOR;
END@
有點復雜,但是...
可以通過此單個語句執行所有需要的操作。 E
包含TAG_ID
值(如果存在)。 我們僅在不存在新行時才插入它,並使用SELECT FROM data-change-table-reference檢索插入的TAG_ID
。 最后,我們加入現有行並插入一個。 其中只有一個存在,而我們獲得了這些TAG_IDs
。
如果您使用的是LUW 11.1的Db2,則不需要FOR
循環SELECT COALESCE(E.TAG_ID, I.TAG_ID) INTO P_TAG_ID
SELECT INTO
語句支持CTE,因此可以僅使用一條帶有SELECT COALESCE(E.TAG_ID, I.TAG_ID) INTO P_TAG_ID
而無需循環。 以前的Db2版本不支持它,因此,我們必須使用FOR
循環來檢索單個值。
IN_TAG_DATA
OUT_TAG_ID
P1 : BEGIN ATOMIC
檢查數據庫中是否存在TAG ID
IF EXISTS (SELECT TAG_ID FROM SYSIBM . SYSDUMMY1 WHERE xx = TAG_DATA)
THEN
返回標簽ID
BEGIN
SET OUT_TAG_ID = TAG_ID
END;
ELSE
插入它,然后返回創建的ID
BEGIN
INSERT INTO SCHEMA.TAGS(TAG_DATA)
VALUES(IN_TAG_DATA)
SET OUT_TAG_ID = TAG_ID
END;
END IF;
END P1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.