У меня довольно много отношений «многие ко многим».Чтобы упростить процесс вставки данных в соответствующие три таблицы, у меня есть функция ниже, которую я адаптирую для различных отношений M: M, и она работает как шарм.Однако для ситуаций, когда приходится иметь дело со многими новыми записями, я хотел бы еще больше упростить процесс вставки.
В настоящее время я использую лист .xls со столбцами (и их порядком последовательности), соответствующими их написанию в функции (например, фамилия, имя, адрес электронной почты, телефон, docutype, год, название, citation, digital, url, call_number, report_no, document_description)
Затем я импортирую этот файл .xls вкл.данных в новую таблицу в базе данных, используя «Копировать как оператор вставки» Navicat, а затем копировать и заменять вызов функции в операторе, я получаю операторы вызова функций для всех записей в таблице, выглядящих примерно так:
SELECT junction_insert_into_author_reportav ('Smith', 'Victoria',
some@email.com, NULL, 'Report', '2010', ' Geographical Place Names',
'Some citation, 'f', 'NULL', 'REP/63', NULL, NULL);
Это работает нормально, но я бы хотел еще больше сократить количество шагов, если это возможно.Например, имея возможность передать вновь созданную таблицу, в которую я импортировал лист .xls, в качестве параметра функции - и затем снова удалить новую таблицу после выполнения операторов вставки в функции.Я просто не уверен, как это сделать, и если это вообще возможно?
Вот пример функции, как она выглядит и работает в данный момент:
CREATE OR REPLACE FUNCTION junction_insert_into_author_reportav (
p_surname VARCHAR,
p_fname VARCHAR,
p_email VARCHAR,
p_phone TEXT,
p_docutype VARCHAR,
p_year int4,
p_title VARCHAR,
p_citation VARCHAR,
p_digital bool,
p_url TEXT,
p_call_no VARCHAR,
p_report_no VARCHAR,
p_docu_description VARCHAR
) RETURNS void AS $BODY$
DECLARE
v_authorId INT;
v_reportavId INT;
BEGIN
SELECT
author_id INTO v_authorId
FROM
author
WHERE
surname = p_surname
AND fname = p_fname;
SELECT
reportav_id INTO v_reportavId
FROM
report_av
WHERE
title = p_title;
IF
( v_authorId IS NULL ) THEN
INSERT INTO author ( surname, fname, email, phone )
VALUES
( p_surname, p_fname, p_email, p_phone ) RETURNING author_id INTO v_authorId;
END IF;
IF
( v_reportavId IS NULL ) THEN
INSERT INTO report_av ( docu_type, YEAR, title, citation, digital, url, call_number, report_no, docu_description )
VALUES
( p_docutype, p_year, p_title, p_citation, p_digital, p_url, p_call_no, p_report_no, p_docu_description ) RETURNING reportav_id INTO v_reportavId;
END IF;
INSERT INTO jnc_author_reportav
VALUES ( v_authorId, v_reportavId );
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100