以字符串格式显示电影描述
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>
我觉得不错。
我有一个任务需要写一个带格式的触发语句
这是我的数据库架构:
我这样写代码
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>
我觉得不错。