触发器SQL语句
大家好,我正在写一条语句,在Oracle中创建一个触发器,将文本附加到数据库中插入的每个新游戏的描述中 我希望格式是这样的触发器SQL语句,sql,oracle,triggers,Sql,Oracle,Triggers,大家好,我正在写一条语句,在Oracle中创建一个触发器,将文本附加到数据库中插入的每个新游戏的描述中 我希望格式是这样的 Format: (rating). (Name) is (Genre) Example: M18. Dragon Ball, Genre is Fighting/Adventure. 游戏表中的GenreID和子类型是类型表的外键 配子体序列 CREATE SEQUENCE "GAME_ID_SEQ" MINVALUE 100 MAXVALUE
Format: (rating). (Name) is (Genre)
Example: M18. Dragon Ball, Genre is Fighting/Adventure.
游戏表中的GenreID和子类型是类型表的外键
配子体序列
CREATE SEQUENCE "GAME_ID_SEQ" MINVALUE 100 MAXVALUE 999999999
INCREMENT BY 5 START WITH 100;
配子体触发器
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
正常(尽管可以重写为)
游戏不好,有各种各样的错误
- 插入之前不是
,而是在
- 第二个
选择
引用
表中的流派
列,但根据您发布的内容,该列在表中不存在(但存在于subgenreid
)游戏中
只允许两个参数。您最好切换到双管连接操作符。concat
- 此外,您还连接了一些未知的
和评级
。它们是什么标题
- 此外,您还连接了一些未知的
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>
还有一条建议:当甲骨文公司说你有错误时,问问他们是哪一个。怎么用?这样(在SQL*Plus中)(这是您的代码): 或者,查询
用户错误
:
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>
你为什么需要扳机?除了选择之外,触发器没有要执行的操作。改为使用匿名块。谈论你的代码
变量声明缺少代码>。请键入“显示错误”或查询user\u errors
以查看编译器错误的位置。如前所述,两个变量声明中都缺少分号concat
也只接受两个参数,不能用它来表示任意数量的字符串。您可以使用字符串连接运算符|
,也可以构建嵌套的concat
语句。将此描述显式存储在表中是没有意义的,通常不赞成这种非规范化。最好创建一个按需生成描述的视图和/或函数。还应为局部变量使用锚定声明,即gen-genre.name%type这样,如果有人重新定义了一列的长度,你的代码就不需要修改了。嗨,你能给我举个例子吗?因为我对这个很陌生,我正试图理解如何进行触发操作,这就是为什么我决定使用它的原因。多谢各位!我真的很感谢你的解释,现在我对它有了更好的看法。干杯
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>
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>