sql - 触发 SQL 语句
问题描述
嗨,我正在编写一个语句来在 Oracle 中创建一个触发器,该触发器会将文本附加到插入数据库中的每个新游戏的描述中。
我希望格式像
Format: (rating). (Name) is (Genre)
Example: M18. Dragon Ball, Genre is Fighting/Adventure.
Game Table 中的 GenreID 和 subGenre 是 Genre Table 的外键。
游戏ID序列
CREATE SEQUENCE "GAME_ID_SEQ" MINVALUE 100 MAXVALUE 999999999
INCREMENT BY 5 START WITH 100;
GameID 触发器
CREATE OR REPLACE TRIGGER "tr_gameID"
BEFORE INSERT ON "GAME"
FOR EACH ROW
BEGIN
SELECT "GAME_ID_SEQ".NEXTVAL INTO :NEW.gameID FROM DUAL;
END;
/
游戏描述触发器
CREATE OR REPLACE TRIGGER "GAME_DES"
BEFORE INSERT OF GAME
FOR EACH ROW
DECLARE
gen VARCHAR2(8);
subGen VARCHAR2(8);
BEGIN
SELECT name INTO gen FROM GENRE WHERE GenreID = :NEW.GenreID;
SELECT name INTO subGen FROM GENRE WHERE subGenreID = :NEW.GenreID;
SELECT CONCAT(rating,".", title ,"Genre is", gen, "/", subGen) INTO :NEW.description FROM DUAL;
END;
/
我不确定我在哪里做错了。但我不断收到“警告:使用编译错误创建的触发器”。
解决方案
你做错了什么?几件事。
TR_GAMEID
可以(虽然,可以改写为)
SQL> create or replace trigger tr_gameid
2 before insert on game
3 for each row
4 begin
5 :new.gameid := game_id_seq.nextval;
6 end;
7 /
Trigger created.
GAME_DES 不正常,出现各种错误。
- 不是
before insert OF
但ON
- 表中的第二个
select
参考subgenreid
列genre
,但是-根据您发布的内容-表中不存在这样的列(但存在于game
) concat
只允许 2 个参数。您宁愿切换到双管道||
连接运算符。- 另外,您正在连接一些未知的
rating
事物title
。这些是什么?
- 另外,您正在连接一些未知的
以下触发器编译但可能是错误的,因为第二个select
看起来很可疑。
SQL> create or replace trigger game_Des
2 before insert on game
3 for each row
4 declare
5 gen varchar2(8);
6 subgen varchar2(8);
7 begin
8 select name into gen from genre where genreid = :new.genreid;
9 select name into subgen from genre where genreid = :new.genreid;
10 :new.description := 'Genre is ' || gen ||'/'|| subgen;
11 end;
12 /
Trigger created.
SQL>
此外,还有一条建议:当 Oracle 说您遇到错误时,请询问它们是哪些错误。如何?像这样(在 SQL*Plus 中)(这是您的代码):
SQL> CREATE OR REPLACE TRIGGER "GAME_DES"
2 BEFORE INSERT ON GAME --> I fixed this
3 FOR EACH ROW
4 DECLARE
5 gen VARCHAR2(8);
6 subGen VARCHAR2(8);
7 BEGIN
8 SELECT name INTO gen FROM GENRE WHERE GenreID = :NEW.GenreID;
9 SELECT name INTO subGen FROM GENRE WHERE subGenreID = :NEW.GenreID;
10 SELECT CONCAT(rating,".", title ,"Genre is", gen, "/", subGen) INTO :NEW.description FROM DUAL;
11 END;
12 /
Warning: Trigger created with compilation errors.
SQL> show err
Errors for TRIGGER "GAME_DES":
LINE/COL ERROR
-------- -----------------------------------------------------------------
7/3 PL/SQL: SQL Statement ignored
7/10 PL/SQL: ORA-00909: invalid number of arguments
SQL>
或者,查询USER_ERRORS
:
SQL> select text, line, position
2 from user_errors
3 where name = 'GAME_DES';
TEXT LINE POSITION
-------------------------------------------------- ---------- ----------
PL/SQL: ORA-00909: invalid number of arguments 7 10
PL/SQL: SQL Statement ignored 7 3
SQL>
推荐阅读
- javascript - 通过 NetBeans 从另一个表数据插入 SQL 表数据
- oracle-adf - 在 JDeveloper 中使用 Required 属性进行验证
- string - 将多项式格式化为范式>(如何让最终结果变成lisp中的字符串?(包括所有函数))
- javascript - 在 firefox 中处于调试模式时会呈现 HTML 元素,但不会在正常加载时呈现
- react-native - 组件列表为空
- c++ - 在 Windows,VS2K17 上调试构建 mysql-connector c++ 应用程序
- powershell - 保存自定义 $variables 以在不同的 PS 会话中访问
- unix - 如何从 Rust 写入特定的原始文件描述符?
- javascript - 在 JavaScript 中创建一个数组
- c++ - 在另一个文件中定义匿名类的方法