postgresql - 如何声明具有非空检查约束的用户定义域类型的变量

标签 postgresql plpgsql

我已经定义了一个从具有 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 变量绑定(bind)到具有非空约束的域类型的值?我很难相信 PostgreSQL 会有这样的限制。

注意:在我的实际应用中,我想为变量分配 INSERT 语句的返回值,因此在 DECLARE block 中分配值似乎不合适。

最佳答案

您可以在DECLARE 部分初始化变量:

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

Note: in my actual application I want to assign the variable the return value of an INSERT statement, so assigning the value within the DECLARE block seems inappropriate.

我不明白这个逻辑。在这种情况下,必须初始化变量,而您别无选择。当然,你可以在函数体中为其赋值。

关于postgresql - 如何声明具有非空检查约束的用户定义域类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643081/

相关文章:

postgresql - Docker 堆栈部署 postgresql 从容器在几分钟内重新启动

postgresql - 电子邮件跟踪数据建模

java - 直接在数据库上处理大量数据是个好主意吗?

function - plpgsql:奇怪的函数内隐式转换

sql - 如何在plpgsql函数中获取当前行值

sql - 在 PostgreSQL 的查询中的窗口函数中使用别名

ruby-on-rails - 带条件查询的 Rails、Heroku 和 PG 语法错误

database - 错误 : could not load library "oracle_fdw.dll": %1 is not a valid Win32 application

PostgreSQL:检查触发器函数中的 NEW 和 OLD

sql - 如何检查一个值是否是 plpgsql 的整数?