以字符串格式显示电影描述

Show film description with string format

我有一个任务需要写一个带格式的触发语句

这是我的数据库架构:

我这样写代码

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)
);

希望您阅读astentx的评论。

这是您could/should的做法。

涉及的表(只包含必要的列):

SQL> CREATE TABLE language
  2  (
  3     language_id   NUMBER PRIMARY KEY,
  4     name          VARCHAR2 (20)
  5  );

Table created.

SQL> INSERT INTO language (language_id, name)
  2     SELECT 1, 'English' FROM DUAL
  3     UNION ALL
  4     SELECT 2, 'Croatian' FROM DUAL;

2 rows created.

SQL> CREATE TABLE film
  2  (
  3     film_id                NUMBER PRIMARY KEY,
  4     title                  VARCHAR2 (20),
  5     description            VARCHAR2 (100),
  6     language_id            NUMBER REFERENCES language,
  7     original_language_id   NUMBER REFERENCES language,
  8     rating                 NUMBER
  9  );

Table created.

触发器:不要 select 来自 table 触发行级触发器,因为你会得到变异 table 错误。对你有好处,你不必这样做 - 使用 :new 伪记录值代替:

SQL> CREATE OR REPLACE TRIGGER bi_film_desp
  2     BEFORE INSERT
  3     ON film
  4     FOR EACH ROW
  5  DECLARE
  6     l_language           language.name%TYPE;
  7     l_original_language  language.name%TYPE;
  8  BEGIN
  9     SELECT l.name
 10       INTO l_language
 11       FROM language l
 12      WHERE l.language_id = :new.language_id;
 13
 14     SELECT l.name
 15       INTO l_original_language
 16       FROM language l
 17      WHERE l.language_id = :new.original_language_id;
 18
 19     :new.description :=
 20           'Rating: '
 21        || :new.rating
 22        || ', original language: '
 23        || l_original_language
 24        || ', language: '
 25        || l_language;
 26  END;
 27  /

Trigger created.

SQL>

我们来测试一下:

SQL> INSERT INTO film (film_id,
  2                    title,
  3                    language_id,
  4                    original_language_id,
  5                    rating)
  6       VALUES (1,
  7               'Izbavitelj',
  8               1,
  9               2,
 10               7);

1 row created.

结果:

SQL> select title, description, rating from film;

TITLE      DESCRIPTION                                                      RATING
---------- ------------------------------------------------------------ ----------
Izbavitelj Rating: 7, original language: Croatian, language: English             7

SQL>

我觉得不错。