Считать данные с CSV-файла в БД PostgreSQL. SQL
Всем привет, я незнаком с работой CSV файлов поэтому решил попросить совета (узнать) здесь как это работает. Работаю в PostgreSQL
COPY mark(id_p,mark,id_dis,date)
FROM 'D:\bd2.csv' DELIMITER ',' CSV HEADER;
Есть у меня такой просто код, в котором я считываю данные с файла, а потом их СРАЗУ заношу в таблицу mark,но когда пользователь вносит данные и загружает их, он же понятия не имеет, что это за айдишники в таблице (у меня в табл. два айдишника), а вносит конкретные данные. И тут у меня БОЛЬШОЙ ВОПРОС.
Как мне считать данные с файла, но перед этим так сказать "обработать их", чтобы уже далее указать нужные для внесения в таблицу айдишники. Понятия не имею как в функции - это сделать......
CREATE OR REPLACE FUNCTION csv_test( csv_name_f TEXT)
RETURNS void
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
COPY mark(id_p,mark,id_dis,date)
FROM 'D:\bd2.csv' DELIMITER ',' CSV HEADER;
END;
$BODY$;
Если у вас есть вариант как решить. Можете скинуть маленький пример, буду очень благодарен.
Ответы (1 шт):
Вообщем-то, у меня получилось. Не обращайте внимание на то, что так много данных (решил ограничения сделать...)
Также есть проблемка. Оно записывает только одну последнюю строку, а все предыдущие просто пропускает. Можно ли это как-то в цикле пройти ?
CREATE OR REPLACE FUNCTION test2(teach integer)
RETURNS void
LANGUAGE 'plpgsql'
AS $BODY$
BEGIN
DROP TABLE IF EXISTS temp_table;
CREATE TEMP TABLE IF NOT EXISTS temp_table (
num varchar,
let varchar,
dis varchar,
last_n varchar,
oc varchar,
dt date
) on commit drop;
COPY temp_table(num,let,dis,last_n,oc,dt)
FROM 'D:\bd2.csv' DELIMITER ',' CSV HEADER encoding 'windows-1251';
insert into sch.ocenka (id_pupil,ocenk,id_discteacher,date)
select
sch.pupil.id_pupil,temp_table.oc,sch.discipline_teacher.id_discteacher,temp_table.dt
from sch.discipline_teacher,sch.discipline,sch.teacher,sch.class,sch.pupil,temp_table
where sch.discipline_teacher.id_class = sch.class.id_class and sch.pupil.id_class =
sch.class.id_class and
sch.discipline_teacher.id_discipline = sch.discipline.id_discipline and
sch.discipline_teacher.id_teacher = sch.teacher.id_teacher and
EXISTS (select * from sch.discipline_teacher
where sch.discipline_teacher.id_class = sch.class.id_class and
sch.discipline_teacher.id_discipline = sch.discipline.id_discipline and
sch.discipline_teacher.id_teacher = sch.teacher.id_teacher and sch.discipline.title
=temp_table.dis and sch.teacher.phone=teach and sch.class.title =temp_table.num and
sch.class.kurs =temp_table.let)
and sch.discipline.title =temp_table.dis and sch.teacher.phone=teach and
sch.class.title =temp_table.num and sch.class.kurs =temp_table.let and
sch.pupil.last_name =temp_table.last_n;
DROP TABLE IF EXISTS temp_table;
END;
$BODY$;