У меня есть две перегруженные функции в 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?