Здравствуйте! Помогите пожалуйста разобраться. Есть таблица
RELATIONSHIP в базе данных
PostgreSQL, где столбцы
STATUS и
SEND по умолчанию имеют значение
false.
| SURVEY_ID | EMPLOYEE | STATUS (default: false) | SEND (default: false) | ORGANIZATION_NAME |
|--------------------------------------|----------|-------------------------|-----------------------|-------------------|
| d5f9c639-13e6-42c1-9043-30783981724b | Mark | false | false | Apple |
| d5f9c639-13e6-42c1-9043-30783981724b | Bob | true | false | Google |
У меня есть процедура, которая выглядит следующим образом:
CREATE OR REPLACE PROCEDURE creator(SURVEY_IDENTIFIER uuid, EMPLOYEES VARCHAR[], ORGANIZATION_NAMES VARCHAR[]) AS $FUNCTION$
BEGIN
INSERT INTO RELATIONSHIP (SURVEY_ID, EMPLOYEE, ORGANIZATION_NAME)
SELECT
SURVEY_IDENTIFIER AS SURVEY_ID,
EMPLOYEE FROM UNNEST(ARRAY[EMPLOYEES], ARRAY[ORGANIZATION_NAMES]) u(EMPLOYEE, ORGANIZATION_NAME)
ON CONFLICT ON CONSTRAINT RELATIONSHIP_UNIQUE_KEY
DO UPDATE SET ORGANIZATION_NAME = u.ORGANIZATION_NAME
WHERE NOT STATUS;
END;
$FUNCTION$ LANGUAGE plpgsql;
Суть процедуры следующая:
1) Если значения, которые мы хотим добавить в таблицу уникальные в рамках столбцов SURVEY_ID и EMPLOYEE необходимо их записать в таблицу.
2) Если значения, которые мы хотим добавить в таблицу не уникальные в рамках столбцов SURVEY_ID и EMPLOYEE, то не нужно их добавлять в таблицу. При этом нужно обновить значение столбца ORGANIZATION_NAME в случаи, если значение в столбце STATUS у существующей записи равна false.
CALL creator(
'd5f9c639-13e6-42c1-9043-30783981724b',
ARRAY['Mark', 'Bob', 'Kate'],
ARRAY['Google', 'Google', 'HP']
);
Другими словами, вызвав данную процедуру следующим образом, я предполагал следующий результат:
| SURVEY_ID | EMPLOYEE | ORGANIZATION_NAME | STATUS (default: false) | SEND (default: false) | ORGANIZATION_NAME |
|--------------------------------------|----------|-------------------|-------------------------|-----------------------|-------------------|
| d5f9c639-13e6-42c1-9043-30783981724b | Mark | Google | false | false | Google |
| d5f9c639-13e6-42c1-9043-30783981724b | Bob | Apple | true | false | Apple |
| d5f9c639-13e6-42c1-9043-30783981724b | Kate | HP | false | false | HP |
При попытке вызова процедуру вышеупомянутым способом появляется ошибка:
SQL Error [42601]: ERROR: INSERT has more target columns than expressions.
WHERE: PL/pgSQL function creator(uuid,character varying[],character varying[]) line 3 at SQL statement.