簡體   English   中英

存儲過程,如果存在返回ID或插入並返回ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM