Я нормализую адреса в моей таблице 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 |
+----+----------+