@nurzhannogerbek

Как исправить проблему в процедуре по добавлению записей?

Здравствуйте! Помогите пожалуйста разобраться. Есть таблица 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.
  • Вопрос задан
  • 854 просмотра
Решения вопроса 1
@d-stream
Готовые решения - не подаю, но...
Что покажет
SELECT 
      SURVEY_IDENTIFIER AS SURVEY_ID,
      EMPLOYEE FROM UNNEST(ARRAY[EMPLOYEES], ARRAY[ORGANIZATION_NAMES]) u(EMPLOYEE, ORGANIZATION_NAME)


?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы