如何声明具有非空检查约束的用户定义域类型的变量
How to declare variable having the type of a user-defined domain with a non-null check constraint
我定义了一个从复合类型派生的域,该复合类型具有 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 语句的 return 值,因此在 DECLARE 块中分配值似乎不合适。
您可以在 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.
我不明白这个逻辑。在这种情况下,必须初始化变量,而您别无选择。当然你可以在函数体中给它赋另外的值。
我定义了一个从复合类型派生的域,该复合类型具有 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 语句的 return 值,因此在 DECLARE 块中分配值似乎不合适。
您可以在 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.
我不明白这个逻辑。在这种情况下,必须初始化变量,而您别无选择。当然你可以在函数体中给它赋另外的值。