2016-08-31 2 views
1

У меня есть таблица с именем rezultz с 1 строкой, содержащая только действительные SQL-запросы, такие как: CREATE TRIGGER ... Я пытаюсь выполнить их с помощью функции get_all_rezultz(), но она не кажется работа, любые идеи, почему?Выполнение строковых запросов из функции

 CREATE OR REPLACE FUNCTION get_all_rezultz() RETURNS SETOF rezultz AS 
    $BODY$ 
    DECLARE 
r rezultz%rowtype; 
    BEGIN 
FOR r IN 
    SELECT * FROM rezultz 
LOOP 
    -- can do some processing here 
    RETURN QUERY EXECUTE r; -- return current row of SELECT 
END LOOP; 
RETURN; 
END 
    $BODY$ 
LANGUAGE plpgsql; 

    SELECT * FROM get_all_rezultz(); 

Здесь ошибка я получаю:

NOTICE: identifier "CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); " will be truncated to "CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE O" 
    CONTEXT: SQL statement "("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ")" 

PL/PgSQL функция get_all_rezultz() строка 10 на RETURN QUERY

ERROR: syntax error at or near ""CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); "" 
    LINE 1: ("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPD... 
    ^
    QUERY: ("CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); ") 
     CONTEXT: PL/pgSQL function get_all_rezultz() line 10 at RETURN QUERY 

********** Ошибка **********

ERROR: syntax error at or near ""CREATE TRIGGER userman_if_modified_trg AFTER INSERT OR UPDATE OR DELETE ON userman   FOR EACH ROW EXECUTE PROCEDURE audit.if_modified_func(); "" 
    SQL state: 42601 
    Context: PL/pgSQL function get_all_rezultz() line 10 at RETURN QUERY 
+0

Добро пожаловать в SO. Что значит «не работает»? Дает ошибку? Не дает ожидаемых результатов? –

+0

Обновлено, где произошла ошибка – Aaron

+0

Это не сработает. Какова фактическая проблема, которую вы пытаетесь решить с этим? Функция не может возвращать несколько результатов, и вы не можете запускать инструкцию DDL с помощью 'return query'. Вы должны сделать шаг назад и объяснить нам лежащую в основе _problem_ у вас. –

ответ

1

Переменная r - запись, содержащая несколько столбцов. Это не скалярное значение (например, строка).

Поэтому вам нужно использовать имя столбца в инструкции execute. Предполагая, что столбец в таблице называется sql_statement вам нужно использовать:

RETURN QUERY EXECUTE r.sql_statement; 

Однако, это все еще не работает, потому что оператор выбора хранится в этой таблице будет наиболее определенно не возвращает результаты, что является SETOF rezultz его возвращает SETOF mytable, если запрос select * from mytable.

Вам необходимо указать RETURNS SETOF record, но тогда вам нужно указать имена столбцов и структуру результата, когда вызывает функцию.

И даже тогда это не сработает, потому что функция возвращает только один результат, а не несколько результатов из нескольких запросов - что произойдет, если rezultz содержит более одной строки.

Если ваши заявления SQL фактически не являются SELECT заявления, как вы утверждали, вам нужно будет использовать EXECUTE вы не можете использовать RETURN QUERY для CREATE TRIGGER заявления.

+0

Я получаю следующую ошибку: ERROR: не может открыть запрос CREATE TRIGGER как курсор – Aaron

+0

Вы не можете запустить инструкцию 'CREATE TRIGGER' с' return query'. Но вы утверждали, что таблица «*, содержащая действительные SQL-запросы, такие как: SELECT * FROM mytable *», не упоминается «create trigger». –

+0

Спасибо, очень хорошая информация, сработала :)! – Aaron