【发布时间】:2021-12-02 10:32:09
【问题描述】:
我的代码是这样写的
CREATE OR REPLACE TRIGGER "BI_FILM_DESP"
BEFORE INSERT ON "FILM"
FOR EACH ROW
DECLARE
RatingFilm VARCHAR2(8);
Seq NUMBER(3);
OriginalL VARCHAR2(20);
Language VARCHAR2(20);
BEGIN
SELECT RATING INTO RatingFilm FROM FILM F;
SELECT COUNT(RATING) INTO Seq FROM FILM F GROUP BY F.RATING;
SELECT LANGUAGE.NAME INTO OriginalL FROM LANGUAGE L WHERE (L.LANGUAGE_ID =: FILM.LANGUAGE_ID);
SELECT LANGUAGE.NAME INTO Language FRoM LANGUAGE L WHERE (L.LANGUAGE_ID =: FILM.LANGUAGE_ID);
SELECT CONCAT(RatingFilm, "-", Seq, ": Originally in", OriginalL, ". Re-released in ", Language, ".");
END;
/
我认为很难阅读这些错误,我需要一些帮助来纠正它。提前致谢。
编辑:添加创建表的代码
CREATE TABLE film (
film_id NUMBER(5) NOT NULL,
title varchar2(255),
description varchar2(255),
release_year NUMBER(4) DEFAULT NULL,
language_id NUMBER(3) NOT NULL,
original_language_id NUMBER(3) DEFAULT NULL,
rental_duration NUMBER(3) DEFAULT 3 NOT NULL,
rental_rate NUMBER(4,2) DEFAULT '4.99' NOT NULL,
length NUMBER(5) DEFAULT NULL,
replacement_cost NUMBER(5,2) DEFAULT '19.99' NOT NULL,
rating varchar2(8) DEFAULT 'G' NOT NULL,
special_features varchar2(255) DEFAULT NULL
);
CREATE TABLE language (
language_id NUMBER(3) NOT NULL,
name varchar2(20)
);
【问题讨论】:
-
(1) MySQL OracleDB,标记列表已编辑 (2) 在
SELECT LANGUAGE.NAME INTO OriginalL FROM LANGUAGE L WHERE (L.LANGUAGE_ID =: FILM.LANGUAGE_ID);中,表FILM未在 FROM 子句中作为行源提及。 (3) 在基于行的触发器中,您必须参考NEW伪表来访问当前行值。 -
1) 在 Oracle 中,字符串应该用单引号
'括起来,双引号用于标识符。 2)你不能从任何地方选择,当你需要一些常量时你应该使用from dual。 3) 您不能使用for each row访问触发器内的同一个表,您将收到变异表错误。 4)select不带过滤器会返回多行,不能放入标量变量。所以要解决的问题太多了,试着一步一步构建你的解决方案。
标签: sql oracle triggers string-concatenation