Хранимая процедура, если существует идентификатор возврата или вставка и идентификатор возврата - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть довольно простая хранимая процедура DB2, где я беру строку параметра и вставляю ее в таблицу, которая прекрасно работает, но мне действительно нужно ее расширить. В настоящее время это выглядит так:

    IN_TAG_DATA


    P1 : BEGIN ATOMIC

    INSERT INTO SCHEMA.TAGS(TAG_DATA)
    VALUES(IN_TAG_DATA);

    END P1

То, что мне нужно сделать сейчас, это поместить в тот же строковый параметр, но на основе этого параметра, мне нужно проверить, существует ли имя, и если да, выбрать / вернуть его идентификатор. Если он не существует, мне нужно вставить его, а затем вернуть созданный идентификатор.

Как мне изменить это, чтобы получить соответствующую функцию здесь?

    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

Ответы [ 2 ]

1 голос
/ 17 апреля 2019
--#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, если оно существует.Мы вставляем новую строку, только если она не существует, и извлекаем вставленную TAG_ID, используя SELECT FROM data-change-table-reference .Наконец, мы присоединяемся к существующей строке и вставляем одну.Существует только один из них, и мы получаем один из них TAG_IDs.

Если вы находитесь на Db2 для LUW 11.1, тогда цикл FOR не нужен - оператор SELECT INTO поддерживает CTE, поэтому одинможет использовать только один оператор с SELECT COALESCE(E.TAG_ID, I.TAG_ID) INTO P_TAG_ID без цикла.Предыдущие версии Db2 не поддерживают его, поэтому мы должны использовать цикл FOR только для извлечения одного значения.

0 голосов
/ 17 апреля 2019
IN_TAG_DATA
OUT_TAG_ID

P1 : BEGIN ATOMIC

Проверить, существует ли идентификатор TAG в базе данных

IF EXISTS (SELECT TAG_ID FROM SYSIBM . SYSDUMMY1 WHERE xx = TAG_DATA) 
THEN

Вернуть идентификатор TAG

BEGIN
SET OUT_TAG_ID = TAG_ID
END;
ELSE

, вставить его, а затем вернуть созданный идентификатор

BEGIN
INSERT INTO SCHEMA.TAGS(TAG_DATA)
VALUES(IN_TAG_DATA)
SET OUT_TAG_ID = TAG_ID
END;
END IF;

END P1
...