Postgresql - передает таблицу в функцию вставки «многие ко многим» - PullRequest
0 голосов
/ 25 декабря 2018

У меня довольно много отношений «многие ко многим».Чтобы упростить процесс вставки данных в соответствующие три таблицы, у меня есть функция ниже, которую я адаптирую для различных отношений 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...