触发器SQL语句

触发器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

大家好,我正在写一条语句,在Oracle中创建一个触发器,将文本附加到数据库中插入的每个新游戏的描述中

我希望格式是这样的

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%typeSQL> 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>