我正在用PostgreSQL开发一个电影数据库。我有一个触发器,在我插入一个新的节目之前,它会检查节目的日期是否早于电影的发行日期(例如,今天添加了一个阿凡达2的节目)。以下是代码:
CREATE TRIGGER beforereleasedate
BEFORE INSERT
ON public.shows
FOR EACH ROW
EXECUTE PROCEDURE public.filmnotreleased();
CREATE FUNCTION public.filmnotreleased()
RETURNS trigger
LANGUAGE 'plpgsql'
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
var1 DATE;
var2 DATE;
BEGIN
SELECT NEW.ShowDate INTO var1
FROM SHOWS;
SELECT ReleaseDate INTO var2
FROM FILM
WHERE CodF=NEW.CodF;
IF var1<var2
THEN
RAISE EXCEPTION 'Can't add a show of a movie still not released.';
END IF;
RETURN NEW;
END;
$BODY$;
ALTER FUNCTION public.filmnotreleased()
OWNER TO postgres;
问题是,如果SHOWS表为空,var1为空。已通过“加薪通知”进行检查。奇怪的是,只有当表为空时才会发生这种情况。所以,无论我使用什么日期,第一次插入都是错误的。之后,触发器正常工作,var1不再为NULL,而是具有我刚刚插入的值。
有什么帮助吗?
部分:选择新建。ShowDate从SHOWS进入var1
毫无意义。为了将一个变量(
new.showdate
)的值存储到另一个变量(var1
)中,您正在读取表shows
中的所有行。显然,如果表为空,SELECT不会返回任何行,这意味着var1
将为空。
但是不需要从表中读取任何内容,因为您可以通过
new
记录访问当前插入的行。
所以你可能想要这样的东西:
CREATE FUNCTION public.filmnonuscito()
RETURNS trigger
LANGUAGE plpgsql
COST 100
VOLATILE NOT LEAKPROOF
AS $BODY$
DECLARE
var2 DATE;
BEGIN
SELECT ReleaseDate
INTO var2
FROM FILM
WHERE CodF=NEW.CodF;
IF NEW.showdate < var2
THEN
RAISE EXCEPTION 'Can't add a show of a movie still not released.';
END IF;
RETURN NEW;
END;
$BODY$;
请注意,如果根本没有这样的电影,这并不能处理这种情况。您可能需要添加一个
null
检查来处理这个问题,例如if NEW. show date
问题内容: 在某些地方,我看到了语法,其中用名称初始化变量,有时不使用名称初始化。例如: 命名变量有 什么意义? 问题答案: 该参数是可选的(可以创建带有或不带有它的变量和常量),并且在程序中使用的变量不依赖于它。名称在两个地方可能会有所帮助: 当您想要保存或还原变量时 (可以在计算后将它们保存到二进制文件中)。从文档: 默认情况下,它为每个变量使用Variable.name属性的值 但是你有变量
问题内容: 简介文档中有很多段落专门介绍了和之间的区别,但是实际上,您可以在本地范围内创建对象并将其返回。 为什么要使用一对分配器? 问题答案: 您可以做的事情,您无法做其他任何事情: 建立频道 创建一个预先分配了空间的地图 创建具有预分配空间或len!= cap的切片 证明有一点困难。使它变得更容易的主要事情是创建指向非复合类型的指针。以下两个功能是等效的。简而言之:
我经常看到函数或方法返回Result 换句话说,这种返回不会返回任何内容或错误。为什么使用会导致这种情况,而不是一种选择?我认为这个选项更合适,因为在我们的示例中,它实际上不返回任何值或值——无或错误。
这个程序要求我写一个程序,要求用户键入两个数字x,y,和一个算术符号s。根据输入的符号,程序将两个数字相加或相减,并使用带有三个参数的返回类型方法返回结果。 示例:如果输入是2、3和'+'。然后,程序将打印:5 这就是我所做的; 但我无法在不知道为什么的if命令中获取(char1)
我正在使用VS2022,。NET 6,C#10,在项目范围内启用了可为空上下文。 变量正在解析为可为空的类型
到目前为止,我得到了indexOutOfBoundsException错误