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 に答える