Лучший способ заполнить массив из SELECT - PullRequest
0 голосов
/ 04 июля 2018

Я создаю функцию для удаления категории продукта из базы данных. Сначала он выбирает все дочерние таблицы, которые наследуются от таблицы, из которой необходимо удалить, и возвращает объект JSON с именами таблиц, если от него зависят дочерние категории. Какой самый эффективный способ заполнить массив значениями из запроса SELECT?

CREATE OR REPLACE FUNCTION delete_category(catid INT)
RETURNS json AS $$
DECLARE
    depend "catalog";
    dependlist "catalog"[];
BEGIN
    FOR depend IN SELECT * FROM catalog LOOP
        dependlist:=dependlist || depend;
END LOOP;
END;
$$ LANGUAGE plpgsql;

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я использовал функцию array_agg (), и это работало нормально. Единственное, в чем я не уверен - почему я добавил зависимость после имени таблицы в FROM?

CREATE OR REPLACE FUNCTION delete_category(catid INT)
RETURNS jsonb AS $$
DECLARE
    --depend "catalog";
    dependlist "catalog"[];
    cnt INT;
BEGIN
    --Check no other tables dependent 
    SELECT array_agg(depend) INTO dependlist FROM catalog depend
        WHERE inherit_from=catid;
    IF array_length(dependlist,1) IS NOT NULL THEN
        RETURN jsonb_build_object('error',
            'children','tables',to_jsonb(dependlist));
    END IF;
    --Check table is empty of products
    SELECT COUNT(*) INTO cnt FROM (SELECT tablename
        FROM catalog WHERE catalogid=catid) AS tname;
    RETURN jsonb_build_object('error','none');
END;
$$ LANGUAGE plpgsql;
0 голосов
/ 05 июля 2018

Использование оператора добавления || довольно медленный путь - в некоторых старых версиях PostgreSQL он ужасно медленный. Вы можете использовать две возможности - упомянутый конструктор array_agg или ARRAY(SUBSELECT):

dependlist := ARRAY(SELECT depend FROM catalog);

или

dependlist := (SELECT array_agg(depend) FROM catalog);

или

SELECT array_agg(depend) FROM catalog INTO dependlist;

Производительность должна быть одинаковой для всех возможностей.

...