запрос не имеет назначения для данных результата в функции, которая имеет набор инструкций в postgresql - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь автоматизировать набор предложений, которые я выполняю несколько раз в день. Для этого я хочу поместить их в функцию postgres и просто вызвать функцию для последовательного выполнения предложений. Если все работает нормально, то в конце верните значение SUCCESS. Следующая функция повторяет мою идею и ошибку, которую я получаю при ее выполнении:

CREATE OR REPLACE FUNCTION createTable() RETURNS int AS $$
     BEGIN
          DROP TABLE IF EXISTS MY_TABLE; 
          CREATE TABLE MY_TABLE
            (
                    ID integer
            )
             WITH (
                OIDS=FALSE
            );

            insert into MY_TABLE values(1);

            select * from MY_TABLE;
            RETURN 'SUCCESS';
     END;
$$ LANGUAGE plpgsql;

Вызов:

select * from createTable();

С моим незнанием postgresql я ожидал бы получить значение SUCCESSв качестве возврата (если все работает без ошибок). Но возвращенное сообщение вызывает у меня путаницу, разве это не то же самое, что функция в любом другом языке программирования? При выполнении функции я получаю следующее сообщение:

запрос не имеет места назначения для данных результата. Подсказка: если вы хотите отменить результаты SELECT, вместо этого используйте PERFORM.

1 Ответ

0 голосов
/ 02 ноября 2019

запрос не имеет места назначения для данных результата. Подсказка: если вы хотите отменить результаты SELECT, вместо этого используйте PERFORM.

Вы получаете эту ошибку, потому что вы не назначаетеприводит к любой переменной в функции. В функции вы обычно делаете что-то вроде этого:

select * into var1 from MY_TABLE;

Поэтому ваша функция будет выглядеть примерно так:

CREATE OR REPLACE FUNCTION createTable() RETURNS int AS $$
     DECLARE
       var1 my_table%ROWTYPE;
     BEGIN
          DROP TABLE IF EXISTS MY_TABLE; 
          CREATE TABLE MY_TABLE
            (
                    ID integer
            )
             WITH (
                OIDS=FALSE
            );

            insert into MY_TABLE values(1);

            select * into var1 from MY_TABLE;
            <do something with var1>
            RETURN 'SUCCESS';
     END;
$$ LANGUAGE plpgsql;

В противном случае, если вы не поставитерезультаты в переменную, то вы, вероятно, надеетесь достичь некоторого побочного эффекта (например, продвижение последовательности или запуск триггера каким-либо образом). В этом случае plpgsql ожидает, что вы будете использовать PERFORM вместо SELECT

Кроме того, кстати, ваша функция RETURNS int, но в нижней части вашего определения вы RETURN 'SUCCESS'. SUCCESS относится к типу text, а не int, поэтому в конечном итоге вы получите эту ошибку, как только получите это первое сообщение об ошибке - обязательно измените его при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...