Функция Postgresql игнорирует оператор возврата и переходит к следующему возвращению - PullRequest
0 голосов
/ 03 ноября 2018

Я пытался создать функцию postgres, которая возвращает таблицу, но когда я выполняю функцию, оператор return должен закрыть или завершить всю функцию, однако он продолжает игнорировать это окончание, и продолжается.

Функция довольно проста: она просто проходит проверку, если поля пусты. Я знаю, что если я поставлю ELSE заявление, проблема будет решена, однако я не знаю, почему оно игнорирует RETURN , и мне любопытно узнать, есть ли другой способ ELSE , чтобы решить проблему

create or replace function fnRegisterUserWin(rUsername text, rFname text, rLname text,rRole text, rBrand text) returns table(id_users int, message text, is_failure_location text, error_fields text[])
  language plpgsql
  as $$
  declare
    sanitazedUsername text;
    sanitazedFirstname text;
    sanitazedLastname text;
    sanitazedRole text;
    sanitazedBrand text;
    errorFields text;
  begin
    sanitazedUsername := str_clean(rUsername,true,true,true,true,true,true,true);
    sanitazedFirstname := str_clean(rFname,true,true,true,true,true,true,true);
    sanitazedLastname := str_clean(rLname,true,true,true,true,true,true,true);
    sanitazedRole := str_clean(rRole,true,true,true,true,true,true,true);
    sanitazedBrand := str_clean(rBrand,true,true,true,true,true,true,true);
    errorFields := '';

    if(empty2null(sanitazedUsername) is null OR empty2null(sanitazedFirstname) is null OR
       empty2null(sanitazedLastname) is null OR empty2null(sanitazedRole) is null OR
       empty2null(sanitazedBrand) is null) then
      if(empty2null(sanitazedUsername) is null) then  errorFields := errorFields || chr(39) || 'Username' || chr(39); end if;
      if(empty2null(sanitazedFirstname) is null) then errorFields := errorFields || ',' || chr(39) || 'Firstname' || chr(39); end if;
      if(empty2null(sanitazedLastname) is null) then errorFields := errorFields || ',' || chr(39) || 'Lastname' || chr(39); end if;
      if(empty2null(sanitazedRole) is null) then errorFields := errorFields || ',' || chr(39) || 'Role' || chr(39); end if;
      if(empty2null(sanitazedBrand) is null) then errorFields := errorFields || ',' || chr(39) || 'Brand' || chr(39); end if;
      return query select  0 as id_users, 'There are required fields that are empty, please complete them and try again. '::text as message,'Empty Fields'::text as is_failure_location,ARRAY[ltrim(',sa,aaa',',')]as errorFields;
    end if;
    return query execute 'select 0 as id_users, ' || chr(39) || 'There are required fields that are empty, please complete them and try again. ' || chr(39) || '::text as message,' || chr(39) || 'Empty Fields' || chr(39) || '::text as is_failure_location,ARRAY[' || ltrim(errorFields,',') ||']as errorFields';
  end;
  $$;

create function empty2null(text_i character varying)
  returns character varying
language plpgsql
as $$
declare
text_p varchar;
begin
if text_i = ''
then text_p := null;
else text_p := text_i;
end if;
return text_p;
end;
$$;

alter function empty2null(varchar)
  owner to postgres;

это возвращение:

0 Обязательные поля заполнены, заполните их и Попробуйте снова. Пустые поля {'Имя'}

0 Заполните обязательные поля, заполните их и Попробуйте снова. Пустые поля {Имя}

1 Ответ

0 голосов
/ 03 ноября 2018

Два оператора return query выполняются, потому что return query не выходит из функции. Если вы хотите выйти в конце блока if, вы можете добавить оператор return (один).

Согласно документ :

RETURN QUERY фактически не возвращаются из функции - они просто добавить ноль или более строк в набор результатов функции. Исполнение тогда продолжается со следующего оператора в функции PL / pgSQL. Как последующие команды RETURN NEXT или RETURN QUERY выполняются, набор результатов создан. Окончательный возврат, который не должен иметь аргументов, вызывает управление, чтобы выйти из функции (или вы можете просто позволить контролю достичь конец функции).

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