ОШИБКА: у запроса нет места назначения для данных результата в postgres - PullRequest
0 голосов
/ 17 апреля 2020

Я нормализую адреса в моей таблице old_users_data, чтобы разделить их на отдельные таблицы location и city. Для этого я сделал функцию, которая перебирает строки старых пользователей и создает необходимые записи о местоположении и городе. Dbfiddle здесь

CREATE OR REPLACE FUNCTION test_func() 
RETURNS BOOL AS

$$
DECLARE
    temprow record;
BEGIN
FOR temprow IN 
    SELECT * FROM old_users_data oud
    LOOP

    with city as (
        insert into city (name)
        select temprow.city
        where not exists(
            select id from city where name = temprow.city
        )
        returning id),

        locations AS (
        INSERT INTO locations
            (address, city)
        select temprow.address, id from city
        RETURNING id
        )
    INSERT INTO users (name, location)
        SELECT temprow.name, id
        FROM locations
        RETURNING id;


        raise notice 'Value: %, %', temprow.id, temprow.city;
END LOOP;
RETURN TRUE;
END;
$$

LANGUAGE plpgsql;
SELECT test_func();

Но я получаю сообщение об ошибке:

ERROR:  query has no destination for result data
CONTEXT:  PL/pgSQL function test_func() line 9 at SQL statement

несмотря на наличие оператора возврата.

Вот мои данные: old_users_data таблица

+----+--------+---------------------------+----------+
| id |  name  |          address          |   city   |
+----+--------+---------------------------+----------+
|  1 | sam    | 228 Park Ave S            | New York |
|  2 | rachel | 8474 Augusta St. Brooklyn | New York |
+----+--------+---------------------------+----------+

пользователи таблица

+----+--------+-------------+
| id |  name  | location_id |
+----+--------+-------------+
|  1 | sam    |           1 |
|  2 | rachel |           2 |
+----+--------+-------------+

местоположение таблица

+----+---------------------------+---------+
| id |          address          | city_id |
+----+---------------------------+---------+
|  1 | 228 Park Ave S            |       1 |
|  2 | 8474 Augusta St. Brooklyn |       1 |
+----+---------------------------+---------+

город стол

+----+----------+
| id |   name   |
+----+----------+
|  1 | New York |
+----+----------+

1 Ответ

1 голос
/ 17 апреля 2020

Я могу посоветовать другой подход для решения этой проблемы в 3 запросах:

  1. Создать таблицу городов:
insert into city ("name") select distinct city from old_users_data;
Создать таблицу местоположений:
insert into locations ("address", "city_id")
select distinct address, city.id as city_id 
from old_user_data join city on city.name = old_user_data.city;
Создать таблицу пользователей:
insert into users ("name", "location_id") 
select oud.name, l.id as location_id 
from old_user_data as oud
join city c on oud.city = c.name
join locaton l on l.name = oud.address and l.city_id = c.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...