Неожиданное разрешение перегруженной функции в PL / pgSQL - PullRequest
0 голосов
/ 01 мая 2019

У меня есть две перегруженные функции в PL / pgSQL.

Одна функция должна вызывать другую при определенных обстоятельствах, но в данный момент вызов не будет преобразован в правильную функцию.

Первая функция принимает UUID в качестве аргумента, другая функция принимает два составных типа (которые являются таблицами) в качестве аргументов.

При вызове функции с двумя аргументами выдается следующая ошибка:

ERROR:  invalid input syntax for uuid: "(,,,,,,,,,,,)"

Это, очевидно, означает, что вызов функции преобразуется в функцию с одним аргументом UUID, даже если функция вызывается с двумя предоставленными аргументами.

Вот код:

CREATE OR REPLACE FUNCTION sales.price (_cost prd.cost, _price sales.price)
RETURNS sales.price AS
$$
DECLARE
  result sales.price;
BEGIN
  IF _price.margin_id IS NOT NULL THEN
    SELECT
      mg.amount INTO _price.margin
    FROM sales.margin mg
    WHERE mg.margin_id = _price.margin_id;
  ELSIF _price.markup_id IS NOT NULL THEN
    SELECT
      mk.amount INTO _price.markup
    FROM sales.markup mk
    WHERE mk.markup_id = _price.markup_id;
  END IF;

  RETURN result;
END
$$
LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION sales.price (uuid) RETURNS sales.price AS
$$
DECLARE
  result sales.price;
BEGIN
  SELECT DISTINCT ON (pp.product_uuid)
    p.*
  INTO
    result
  FROM sales.product_price pp
  LEFT JOIN sales.price p
    ON p.price_uuid = pp.price_uuid
  WHERE pp.product_uuid = $1
  ORDER BY pp.product_uuid, p.created DESC;

  IF NOT (result IS NULL) THEN
    SELECT
      sales.price(prd.cost($1), result) — Error thrown here
    INTO
      result;
  END IF;

  RETURN result;
END
$$
LANGUAGE plpgsql;

Я потратил на это целый день и просто не могу заставить его работать.

Можно ли даже вызвать перегруженную функцию с ее тезки? Можно ли явно указать, какую функцию следует вызывать?

Как разрешить перегруженные функции в PL / pgSQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...