2012-05-13 2 views
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; 

ответ

5

Вы не можете использовать EXECUTE в SQL заявления - ВЫПОЛНИТЬ только plpgsql заявление, поэтому он не может быть внутри SQL -

EXECUTE string INTO variable 
+0

Я вижу, спасибо. Как создать массив из запроса EXECUTE, чем? –

+1

ВЫПОЛНИТЬ ВЫБОР МАССЫ (ВЫБЕРИТЕ mycolumn FROM mytable) 'INTO avar; или в вашем примереL: EXECUTE 'SELECT ARRAY (' || findAllQuery || ')' INTO ... Просто обратите внимание - вы не уязвимы для SQL-инъекции - вам нужно использовать функции quote_ident для безопасного цитирования идентификаторов внутри динамического SQL –

+0

Еще раз большое спасибо! Это работает :). Я говорю это, вы имеете в виду, что мой запрос ** является вульгарным для инъекций, и я должен переписать его на 'findAllQuery: = 'SELECT DISTINCT' || quote_ident (mapTable2_key) || 'FROM' || quote_ident (mapping_table) || 'ГДЕ' || quote_ident (mapTable1_key) || '= ANY (inputIdsToDelete)'; '? Моя единственная проблема теперь - связать мой входной массив 'inputIdsToDelete' в запросе select. Я получаю еще одну ошибку, например Error: Column inputIdsToDelete не существует. Должен ли я открыть вопрос с ановтом или вы можете мне помочь здесь? –