Процедура PostgreSQL: «Ни один оператор не соответствует заданному имени и типам аргументов»

#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. Большое вам спасибо за подробный ответ! 🙂