Как объявить переменную, имеющую тип пользовательского домена с ненулевым проверочным ограничением - PullRequest
0 голосов
/ 06 декабря 2018

Я определил домен, унаследованный от составного типа, который имеет ограничение CHECK, чтобы одно из значений его компонента никогда не было нулевым.Я хочу написать функцию языка plpgsql, которая имеет переменную этого типа.Я не могу объявить такую ​​переменную.

Вот упрощенный пример сценария, который выдает мне то же сообщение об ошибке:

CREATE DOMAIN myint AS integer
  CONSTRAINT not_null CHECK (VALUE IS NOT NULL);

CREATE FUNCTION myfunc() RETURNS myint LANGUAGE plpgsql AS $$
  DECLARE
    notnullint myint;
  BEGIN
    notnullint := 1;
    RETURN notnullint;
  END
$$;

mydb=# select myfunc();
ERROR:  value for domain myint violates check constraint "not_null"
CONTEXT:  PL/pgSQL function myfunc() line 4 during statement 
block local variable initialization

Я смущен, думая, что невозможно связатьпеременная plpgsql для значения типа домена, который имеет ненулевое ограничение?Мне трудно поверить, что PostgreSQL будет иметь такое ограничение.

Примечание: в моем реальном приложении я хочу присвоить переменной возвращаемое значение оператора INSERT, поэтому назначение значения в блоке DECLARE кажется неуместным.

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете инициализировать переменные в секции DECLARE:

CREATE FUNCTION myfunc() RETURNS myint LANGUAGE plpgsql AS $$
  DECLARE
    notnullint myint = 0;
  BEGIN
    notnullint := 1;
    RETURN notnullint;
  END
$$;

Примечание: в моем реальном приложении я хочу присвоить переменной возвращаемое значение оператора INSERT, поэтому присваиваем значениевнутри блока DECLARE кажется неуместным.

Я не понимаю этой логики.В этом случае переменная должна быть инициализирована, и у вас нет выбора.Конечно, вы можете присвоить ему другое значение в теле функции.

...