H2: сохранить значение из функции в слиянии - PullRequest
0 голосов
/ 10 марта 2020

Я использую базу данных H2 в Java коде через JDB C.
У меня есть одна таблица с именем WP, которая имеет 6 столбцов (ID, COUNT, WP_NUM, WP_DEN, WEEK, YEAR).

Теперь мне нужно подготовленное утверждение, которое я могу дать значения для всех этих столбцов (кроме количества).
Когда еще нет строки с этим идентификатором, WEEK AND YEAR, он должен просто вставить значение счетчика равно 1.
В противном случае следует увеличить счетчик и обновить WP_NUM и WP_DEN в соответствии со значениями, полученными при вызове SADD (NUM_A, DEN_A, NUM_B, DEN_B).
SADD - это пользовательская функция I добавлено с помощью CREATE ALIAS ... FOR "...", которое определено в Java коде, который возвращает Integer [] {newNum, newDen}, используемый для добавления двух фракций NUM_A / DEN_A и NUM_B / DEN_B.

Что я придумал, так это следующее, хотя это кажется немного сложным. Основная сложность, которую я имею, заключается в том, чтобы как-то сохранить значение, которое возвращает функция, поэтому мне не нужно вызывать его несколько раз, поскольку это довольно дорого. Можно ли как-нибудь упростить это?

MERGE INTO WP
USING (
    SELECT C1, C2, C3, C4, C5, S[1] AS NUM, S[2] AS DEN 
    FROM (
        SELECT V.*, 
        CASE WHEN ID = C1 AND WEEK = C4 AND YEAR = C5 THEN SADD(C2, C3, WP_NUM, WP_DEN) ELSE ARRAY[0, 0] END AS S 
        FROM WP, VALUES(?, ?, ?, ?, ?) AS V 
    ) AS A 
    ORDER BY NUM DESC
    LIMIT 1
) AS B 
ON (ID = C1 AND WEEK = C4 AND YEAR = C5) 
WHEN MATCHED THEN 
    UPDATE SET COUNT = COUNT + 1, WP_NUM = NUM, WP_DEN = DEN
WHEN NOT MATCHED THEN 
    INSERT VALUES (C1, 1, C2, C3, C4, C5);

Редактировать: Я кое-что понял.

MERGE INTO WP
USING (
SELECT * FROM
 VALUES(?, ?, ?, ?, ?) AS V(ID, NUM, DEN, WEEK, YEAR) 
) AS B
ON (WP.ID = B.ID AND WP.WEEK = B.WEEK AND WP.YEAR = B.YEAR) 
WHEN MATCHED THEN
    UPDATE SET COUNT = COUNT + 1, (WEIGHTED_POINTS_NUM, WEIGHTED_POINTS_DEN) = (SADD(B.NUM, B.DEN, WEIGHTED_POINTS_NUM, WEIGHTED_POINTS_DEN))
WHEN NOT MATCHED THEN
    INSERT VALUES (B.ID, 1, NUM, DEN, B.WEEK, B.YEAR);

Теперь единственное, что до сих пор беспокоит меня - это выбор внутри USING , Должен быть лучший способ переименовать выражения выражения VALUES.

...