3
Я пытаюсь создать массив с запросом динамического выбора в функции plpgsql. К сожалению, я получаю синтаксическую ошибку.Создайте массив с динамическим запросом в PL/pgSQL
ERROR: syntax error at or near "EXECUTE"
ZEILE 19: SELECT DISTINCT INTO outputIdsToDelete ARRAY(EXECUTE findA...
^
Может ли кто-нибудь помочь мне, пожалуйста? Вот сама функция:
CREATE OR REPLACE FUNCTION deleteMAPPINGs( mapTable1_key text, mapping_table text, mapTable2_key text, table2 text, table2_key text, inputIdsToDelete bigint[]) RETURNS bigint[] AS $BODY$ DECLARE outputIdsToDelete bigint[]; findAllQuery text; findUnreferencedQuery text; BEGIN findAllQuery := 'SELECT DISTINCT ' || mapTable2_key || ' FROM ' || mapping_table || ' WHERE ' || mapTable1_key || ' = ANY(inputIdsToDelete)'; findUnreferencedQuery := 'SELECT DISTINCT ' || table2_key || --find unused ' FROM ' || table2 || ' WHERE ' || table2_key || ' NOT IN (' || 'SELECT DISTINCT ' || mapTable2_key || --all used ' FROM ' || mapping_table || ')'; SELECT DISTINCT INTO outputIdsToDelete ARRAY(EXECUTE findAllQuery); DELETE FROM mapping_table WHERE mapTable1_key = ANY(inputIdsToDelete) AND mapTable2_key = ANY(outputIdsToDelete); SELECT DISTINCT INTO outputIdsToDelete --overwrite with unused ARRAY(EXECUTE findUnreferencedQuery); RETURN outputIdsToDelete; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;
Я вижу, спасибо. Как создать массив из запроса EXECUTE, чем? –
ВЫПОЛНИТЬ ВЫБОР МАССЫ (ВЫБЕРИТЕ mycolumn FROM mytable) 'INTO avar; или в вашем примереL: EXECUTE 'SELECT ARRAY (' || findAllQuery || ')' INTO ... Просто обратите внимание - вы не уязвимы для SQL-инъекции - вам нужно использовать функции quote_ident для безопасного цитирования идентификаторов внутри динамического SQL –
Еще раз большое спасибо! Это работает :). Я говорю это, вы имеете в виду, что мой запрос ** является вульгарным для инъекций, и я должен переписать его на 'findAllQuery: = 'SELECT DISTINCT' || quote_ident (mapTable2_key) || 'FROM' || quote_ident (mapping_table) || 'ГДЕ' || quote_ident (mapTable1_key) || '= ANY (inputIdsToDelete)'; '? Моя единственная проблема теперь - связать мой входной массив 'inputIdsToDelete' в запросе select. Я получаю еще одну ошибку, например Error: Column inputIdsToDelete не существует. Должен ли я открыть вопрос с ановтом или вы можете мне помочь здесь? –