Выполнить запрос для каждой строки таблицы внутри триггерной функции

Я сделал следующий запрос, который отлично работает сам по себе, но когда я вызываю его внутри триггерной функции, у меня возникает проблема.

select insert_new_grade('title0', return3_6(0), return3_6(1), return3_6(2), s.code)
FROM "student" as s
where find_st(s.grade)>=5;

insert_new_grade — это функция, которая вставляет новую строку в таблицу при каждом вызове.

Вот триггер:

CREATE OR REPLACE FUNCTION insert_d() 
RETURNS TRIGGER AS $$ 
BEGIN
    select insert_new_grade('title0', return3_6(0), return3_6(1), return3_6(2), s.code)
    FROM "student" as s
    where find_st(s.grade)>=5;

    return new;
END;
$$ LANGUAGE plpgsql; 

и вот функция вставки:

CREATE OR REPLACE FUNCTION insert_new_grade(title0 character(100), prof0 character(11), prof1 character(11)) 
RETURNS VOID AS $$
BEGIN
    INSERT INTO "d_table"(thes0, title, grade, prof, secProf) 
    VALUES (null, title0, null, prof0, prof1);
END
$$
LANGUAGE 'plpgsql';

Есть ли способ заставить запрос работать внутри функции триггера? Если я использую выполнить вместо выбора, функция вставки не имеет результата. Я читал о курсорах, но я новичок в postgresql и не знаю, как это сделать. Любая помощь ?


person Athanasia Pavlidou    schedule 28.04.2017    source источник
comment
Возможный дубликат синтаксической ошибки EXECUTE в postgresql   -  person Vao Tsun    schedule 28.04.2017


Ответы (1)


я изменил вашу функцию триггера:

проверьте свою триггерную функцию в conlose pgAdmin, виден raise info текст

CREATE OR REPLACE FUNCTION insert_d() 
RETURNS TRIGGER AS $$ 
declare
    rec record;
BEGIN

    for rec in (select * from student s where find_st(s.grade)>=5) loop

        raise info 'LOOP code = %',rec.code;
        PERFORM insert_new_grade('title0', return3_6(0), return3_6(1), return3_6(2), rec.code);

    end loop;

    return new;
END;
$$ LANGUAGE plpgsql; 
person Piotr R    schedule 28.04.2017
comment
@AthanasiaPavlidou, попробуй без where find_st(s.grade)>=5, возможно, это ошибка - person Piotr R; 28.04.2017