Является ли исключение повышения единственным способом вернуть ошибку из pgplsql в node-postgres?

Скажем, у меня есть функция pgplsql (например, buyItem), которая что-то возвращает (например, параметры купленного предмета). В некоторых случаях я хочу указать, что что-то пошло не так, чтобы результат был пустым (например, недостаточно денег для покупки нужного предмета). Это обычный результат, я бы не назвал это исключением (и уж точно не стал бы печатать об этом ошибку на db сервере, как это делает raise exception).

Итак, вопрос: как лучше всего обращаться с такими случаями?


person Denis Zhbankov    schedule 30.04.2015    source источник


Ответы (1)


У вас есть два варианта: либо вызвать исключение, либо вернуть запись с информацией об успехе и ошибке:

CREATE OR REPLACE FUNCTION buyItem(itemId integer)
RETURNS RECORD
AS $$
DECLARE 
  result RECORD;
BEGIN
  IF itemId > 0 THEN
    SELECT 'purchase successful', NULL INTO result;
  ELSE
    SELECT NULL, 'purchase failed' INTO INTO result;
  END IF;
  RETURN result;
END;
$$ LANGUAGE plpgsql;

Здесь есть еще примеры возврата записей: Return несколько полей в виде записи в PostgreSQL с PL/pgSQL

person David Wolever    schedule 30.04.2015
comment
Хорошо, спасибо, Дэвид. Поэтому, если моя функция действительно возвращает таблицу, второй вариант становится непригодным для использования. - person Denis Zhbankov; 30.04.2015
comment
Если вы возвращаете таблицу, вы также можете добавить дополнительный столбец error. Но я не верю, что возможно вложение внутри записей или строк, поэтому, если вы не хотите сделать что-то вроде преобразования его в массив (и вернуть что-то вроде (error text, results buyItemResult[])), вам не повезло. - person David Wolever; 30.04.2015