как вызвать исключение в postgres, если нет данных о возврате

#sql #postgresql

#sql #postgresql

Вопрос:

Мне нравится создавать операцию сравнения и замены, чтобы ее можно было включить в пакетную транзакцию, где, если оператор cas завершается с ошибкой, остальные операторы также завершатся с ошибкой.

Этот оператор будет обновляться, если время есть 0 , но не выдает ошибку, если время нет 0 :

 UPDATE account
SET time = '1'
WHERE id = (
    SELECT id FROM account WHERE id = 'id-0' and time = '0' LIMIT 1
) RETURNING id
  

Я хочу добавить что-то вроде этого

 IF NO DATA THEN
  RAISE EXCEPTION 'cas ';
END IF;
  

но не уверен, как это сделать.

Комментарии:

1. Вы могли бы сделать это довольно легко, например, из функции plpgsql. Я не знаю, можете ли вы найти способ с помощью простого запроса…

2. Я не вижу проблемы. Проверьте результат запроса, чтобы узнать, сколько строк было обновлено, и выдайте ошибку, если ее не было.

Ответ №1:

Если вы по какой-либо причине не можете использовать блок plpgsql, вы можете принудительно выполнить деление на ноль:

 UPDATE account
SET time = '1'
WHERE id = (
    SELECT id FROM account WHERE id = 'id-0' and time = '0' LIMIT 1
) 
  AND 1/(select count(*) from account where id = 'id-0' and time = '0') is not null
RETURNING id;  
  

Это все равно, что остановить велосипед, на котором я еду, вставив палку в спицы переднего колеса.

Комментарии:

1. как мне написать блок plpgql?

Ответ №2:

Это работает для меня:

 DO $$ 
DECLARE 
v_id TEXT; 
BEGIN 
    UPDATE "account" 
    SET (id, name) = ('t1', 'world') 
    WHERE id = ( SELECT id FROM "account" WHERE "id" = 't1' AND "name" = 'hello' LIMIT 1) 
    RETURNING id INTO v_id; 
    IF count(v_id) = 0 
        THEN RAISE EXCEPTION 'Cas Error for (account, t1)';
    END IF; 
END $$