#sql #postgresql
#sql #postgresql
Вопрос:
В PostgreSQL
базе данных я создал процедуру, которая выглядит следующим образом:
CREATE OR REPLACE PROCEDURE creator(ID uuid, EMPLOYEES VARCHAR[]) AS $FUNCTION$
BEGIN
DELETE FROM SURVEYS_EMPLOYEES_RELATIONSHIP
WHERE SURVEY_ID = ID
AND EMPLOYEE NOT IN (EMPLOYEES);
--
INSERT INTO SURVEYS_EMPLOYEES_RELATIONSHIP (SURVEY_ID, EMPLOYEE)
SELECT SURVEY_ID ID, EMPLOYEE FROM UNNEST(ARRAY[EMPLOYEES]) EMPLOYEE
ON CONFLICT ON CONSTRAINT unique_key
DO NOTHING;
END;
$FUNCTION$ LANGUAGE plpgsql;
Как вы можете видеть, в этой процедуре я пытаюсь DELETE
некоторые записи, а затем INSERT
другие записи. Я вызываю эту процедуру следующим образом:
CALL creator('99c89a24-fff2-4cbc-a542-b1e956a352f9', ARRAY['NNogerbek@gmail.com', 'IKim@gmail.com'])
По какой-то причине это вызывает ошибку:
SQL Error [42883]: ERROR: operator does not exist: character varying <> character varying[]
No operator matches the given name and argument types. You might need to add explicit type casts.
PL/pgSQL function creator(uuid,character varying[]) line 3 at SQL statement
Где именно в процедуре я допустил ошибку?
Ответ №1:
В DELETE
запросе EMPLOYEE NOT IN (EMPLOYEES)
неверно. IN
здесь массив не «отключается», и вы в конечном итоге сравниваете varchar
с a varchar[]
.
Вы можете попытаться заменить его на
EMPLOYEE NOT IN (SELECT e FROM unnest(EMPLOYEES) u (e))
«вручную» отменить вложение массива,
NOT EMPLOYEES @> ARRAY[EMPLOYEE]
использование массива, содержащего оператор или
EMPLOYEE <> ALL (EMPLOYEES)
использование ANY
, где массив автоматически становится «неназначенным». (И, возможно, некоторые другие.)
Комментарии:
1. Большое вам спасибо за подробный ответ! 🙂