ОШИБКА: у запроса нет места назначения для данных результата: Postgresql - PullRequest
0 голосов
/ 06 апреля 2019

Я использую Postgresql11, и функция, которая хорошо работает за один прогон, не работает, когда я добавляю инструкцию LOOP с

"ОШИБКА: у запроса нет места назначения для данных результата. СОВЕТ: Если вы хотите отменить результаты SELECT, вместо этого используйте PERFORM. "

Функция имеет VOID в качестве возвращаемого значения, выбирает данные из исходной таблицы во временную таблицу, вычисляет некоторые данные и вставляет результат в целевую таблицу. Затем временная таблица удаляется, и функция завершается. Я хотел бы повторить эту процедуру через определенные промежутки времени и включить оператор LOOP. С LOOP он не вставляется в целевую таблицу и фактически не зацикливается вообще.


    create function transfer_cs_regular_loop(trading_pair character varying) returns void
        language plpgsql
    as
    $$
    DECLARE
        first_open decimal;
        first_price decimal;
        last_close decimal;
        last_price decimal;
        highest_price decimal;
        lowest_price decimal;
        trade_volume decimal;
        n_trades int;
        start_time bigint;
        last_entry bigint;
        counter int := 0;
        time_frame int := 10;

    BEGIN
        WHILE counter < 100 LOOP
            SELECT  max(token_trades.trade_time) INTO last_entry FROM token_trades WHERE token_trades.trade_symbol = trading_pair;
            RAISE NOTICE 'Latest Entry: %', last_entry;
            start_time = last_entry - (60 * 1000);
            RAISE NOTICE 'Start Time: %', start_time;
            CREATE TEMP TABLE temp_table AS
                SELECT * FROM token_trades where trade_symbol = trading_pair and trade_time > start_time;
            SELECT temp_table.trade_time,temp_table.trade_price INTO first_open, first_price FROM temp_table ORDER BY temp_table.trade_time ASC FETCH FIRST 1 ROW ONLY;
            SELECT temp_table.trade_time,temp_table.trade_price INTO last_close, last_price FROM temp_table ORDER BY temp_table.trade_time DESC FETCH FIRST 1 ROW ONLY;
            SELECT max(temp_table.trade_price) INTO highest_price FROM temp_table;
            SELECT min(temp_table.trade_price) INTO lowest_price FROM temp_table;
            SELECT INTO trade_volume sum(temp_table.trade_quantity) FROM temp_table;
            SELECT INTO n_trades count(*) FROM temp_table;
            INSERT INTO candlestick_data_5min_test(open, high, low, close, open_time, close_time, volume, number_trades, trading_pair) VALUES (first_price, highest_price, lowest_price, last_price, first_open, last_close, trade_volume, n_trades, trading_pair);
            DROP TABLE temp_table;
            counter := counter + 1;
            SELECT pg_sleep(time_frame);
            RAISE NOTICE '**************************Counter: %', counter;
        END LOOP;

    END;
    $$;

1 Ответ

0 голосов
/ 06 апреля 2019

Ошибка относится к последнему оператору SELECT в функции. Если есть SELECT без INTO, он всегда будет возвращать результаты. Если нет LOOP, этот результат будет использоваться как возвращаемое значение функции (даже если оно недействительно).

Когда вы добавляете LOOP, внутри цикла не может быть SELECT без INTO, потому что потребуется одно возвращаемое значение, а теперь их будет много. В этом случае вам нужно использовать PERFORM, который делает то же самое, что и SELECT, но отбрасывает результаты.

Поэтому измените последний SELECT на PERFORM, и ошибка исчезнет:

PERFORM pg_sleep(time_frame);
...