3

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

4

2 回答 2

3

根据手册中的说明:

有时对表达式或SELECT查询求值但丢弃结果很有用,例如在调用具有副作用但没有有用结果值的函数时。要在 PL/pgSQL 中执行此操作,请使用以下PERFORM语句:

PERFORM query;
于 2014-03-27T00:33:04.017 回答
0

我的查询有问题。我能够解决我的问题。在调用函数时使用 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);

进行此更改后,我的功能完美运行。

谢谢。

于 2014-03-26T10:10:59.880 回答