Ссылка на столбец неоднозначна Postgresql - PullRequest
0 голосов
/ 05 августа 2020

Я написал эту функцию для вставки или обновления строк подписки в таблицу подписки:

CREATE OR REPLACE FUNCTION fn_set_subscription(input_subscription_id varchar(50), input_customer_id varchar(50), input_api_key char(16), input_issued_date timestamp, input_subscription_type integer)
RETURNS TABLE (subscription_id varchar(50),
           customer_id varchar(50),
           api_key char(16),
           issued_date timestamp,
           subscription_type smallint) AS
$func$
BEGIN
    RETURN QUERY
    INSERT INTO subscription
    VALUES (input_subscription_id, input_customer_id, input_api_key, input_issued_date, inpu_subscription_type)
    ON CONFLICT (subscription_id)
    DO UPDATE SET issued_date = subscription.issued_date
    RETURNING *;
END
$func$ LANGUAGE plpgsql;

Во время выполнения я получаю следующую ошибку:

postgres     | 2020-08-05 14:11:09.607 UTC [79] ERROR:  column reference "subscription_id" is ambiguous at character 151
postgres     | 2020-08-05 14:11:09.607 UTC [79] DETAIL:  It could refer to either a PL/pgSQL variable or a table column.
postgres     | 2020-08-05 14:11:09.607 UTC [79] QUERY:  INSERT INTO subscription
postgres     |          VALUES (input_subscription_id, input_customer_id, input_api_key, input_issued_date, input_subscription_type)
postgres     |          ON CONFLICT (subscription_id)
postgres     |          DO UPDATE SET issued_date = subscription.issued_date
postgres     |          RETURNING *
postgres     | 2020-08-05 14:11:09.607 UTC [79] CONTEXT:  PL/pgSQL function fn_set_subscription(character varying,character varying,character,timestamp without time zone,integer) line 3 at RETURN QUERY
postgres     | 2020-08-05 14:11:09.607 UTC [79] STATEMENT:  SELECT * FROM fn_set_subscription("input_subscription_id" := $1,"input_customer_id" := $2,"input_api_key" := $3,"input_issued_date" := $4,"input_subscription_type" := $5)

Я пытался изменить имя столбца subscription_id в ON CONFLICT на => ON CONFLICT (subscription.subscription_id), но мне кажется, что это не разрешено.

Любая помощь / улучшения были бы очень признательны.

1 Ответ

1 голос
/ 05 августа 2020

Один из способов преодолеть это - использовать функцию SQL, а не PL / pg SQL:

CREATE OR REPLACE FUNCTION fn_set_subscription(
  input_subscription_id varchar(50), 
  input_customer_id varchar(50), 
  input_api_key char(16), 
  input_issued_date timestamp, 
  input_subscription_type smallint)

RETURNS TABLE (subscription_id varchar(50),
               customer_id varchar(50),
               api_key char(16),
               issued_date timestamp,
               subscription_type smallint) 
AS
$func$
  INSERT INTO subscription (subscription_id, customer_id, api_key, subscription_type)
  VALUES (input_subscription_id, input_customer_id, input_api_key, input_issued_date, input_subscription_type)
  ON CONFLICT (subscription_id)
      DO UPDATE SET issued_date = excluded.issued_date
  RETURNING *;
$func$ 
LANGUAGE sql;

Другая возможность - использовать #variable_conflict use_column, как описано в этом ответе и задокументировано в руководстве

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