Function 错误:使用游标时,查询没有结果数据的目标

Function 错误:使用游标时,查询没有结果数据的目标,function,cursor,plpgsql,postgresql-9.2,ref-cursor,Function,Cursor,Plpgsql,Postgresql 9.2,Ref Cursor,我编写了一个函数,用于为我的项目自动执行一组函数。我使用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 numeri

我编写了一个函数,用于为我的项目自动执行一组函数。我使用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语句中。所以我不知道如何解决这个问题。

我的查询有问题。我能解决我的问题。在调用函数时使用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);
在做了这个改变之后,我的功能运行得很好

谢谢。

有时,对表达式求值或选择查询非常有用,但 放弃结果,例如在调用具有 副作用,但没有有用的结果值。要在PL/pgSQL中执行此操作,请使用
PERFORM
语句:

PERFORM query;