Ошибка: запрос не имеет назначения для данных результатов при использовании курсора

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

CREATE OR REPLACE FUNCTION ccdb.fn_automation()
RETURNS void AS
$BODY$

DECLARE 
sec_col refcursor;
cnt integer;
sec_code ccdb.update_qtable%ROWTYPE;
new_cnt numeric;

BEGIN

SELECT COUNT(*) INTO cnt FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

OPEN sec_col FOR SELECT DISTINCT section_code FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

FOR i IN 1..cnt
LOOP

        FETCH sec_col INTO sec_code;
        SELECT ccdb.o_dtr_update(sec_code.section_code);
        SELECT ccdb.o_consumer_update_for_update(sec_code.section_code);
        SELECT ccdb.o_bills_update_for_update(sec_code.section_code);
        SELECT ccdb.o_payments_update_for_update_new(sec_code.section_code);
        SELECT ccdb.o_payments_map_update_for_update(sec_code.section_code);

        SELECT COUNT(*) INTO new_cnt FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

        IF new_cnt > cnt 
        THEN 
            CLOSE sec_col;

            OPEN sec_col FOR SELECT DISTINCT section_code FROM ccdb.update_qtable WHERE status_flag IN (-1,1);

            cnt := new_cnt;
        END IF;

END LOOP;

CLOSE sec_col;

END;

$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

Теперь проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я пытаюсь выполнить эту функцию, я получаю сообщение об ошибке:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function ccdb.fn_automation() line 20 at SQL statement

Я не знаю, где я должен использовать PERFORM в этой функции. Контекст говорит, что ошибка находится в строке 20, то есть в операторе SELECT, который я использую при открытии моего курсора. Поэтому я не знаю, как решить эту проблему.


person Yousuf Sultan    schedule 26.03.2014    source источник


Ответы (2)



У меня возникла проблема с моим запросом. Я смог решить свою проблему. В функции, где я использую SELECT при вызове функции, я просто заменил ключевое слово SELECT на ключевое слово PERFORM.

Я изменил его и сделал примерно так:

    PERFORM ccdb.o_dtr_update(sec_code.section_code);
    PERFORM ccdb.o_consumer_update_for_update(sec_code.section_code);
    PERFORM ccdb.o_bills_update_for_update(sec_code.section_code);
    PERFORM ccdb.o_payments_update_for_update_new(sec_code.section_code);
    PERFORM ccdb.o_payments_map_update_for_update(sec_code.section_code);

После внесения этого изменения моя функция работала отлично.

Спасибо.

person Yousuf Sultan    schedule 26.03.2014