【问题标题】:SQL ORACLE error in trigger触发器中的 SQL ORACLE 错误
【发布时间】:2015-05-20 13:35:27
【问题描述】:

我正在尝试创建触发器,但出现以下错误:

错误(24,5):PLS-00103:在预期以下之一时找到符号“BEGIN”:* & - + / 在循环 mod 余数 rem 和或 ||多集。我是新手,先谢谢了!

CREATE OR replace TRIGGER ins_livro
      instead OF INSERT ON viewLivros
      FOR EACH ROW
    DECLARE 
    cnt NUMBER := 10;
    biggestID Number;
    BEGIN 
        Select max(exemplar_id) into biggestID from exemplar;
        INSERT INTO livro (
                      id_livro, 
                      nome_livro,
                      id_editora,
                      ano,
                      Preco_Aluguer,
                      Preco_Compra,
                      Preco_Multa
                    ) 
        VALUES      (:new.id_livro, 
                     :new.nome_livro, 
                     :new.id_editora, 
                     :new.ano, 
                     :new.Preco_Aluguer, 
                     :new.Preco_Compra, 
                     :new.Preco_Multa 
                    ); 
        WHILE cnt > 0
        BEGIN
          SET biggestID = biggestID + 1
          INSERT INTO exemplar (
                      id_exemplar,
                      id_livro
                      )
          VALUES      (
                      :new.biggestID,
                      :new.id_livro
                      );
          SET cnt = cnt - 1
        END;
    END; 

【问题讨论】:

    标签: sql oracle plsql triggers syntax-error


    【解决方案1】:

    您缺少loopend loop 子句:

    WHILE cnt > 0
    LOOP
    BEGIN
          SET biggestID = biggestID + 1
          INSERT INTO exemplar (
                      id_exemplar,
                      id_livro
                      )
          VALUES      (
                      :new.biggestID,
                      :new.id_livro
                      );
          SET cnt = cnt - 1
        END;
    END LOOP;
    

    【讨论】:

    • 当然,开始/结束并没有真正在此处添加任何内容。如果没有异常子句,内部块似乎有点毫无意义。
    【解决方案2】:

    您的语法有一些错误。在这里更正一下:

    CREATE OR REPLACE TRIGGER ins_livro INSTEAD OF
      INSERT ON viewLivros FOR EACH ROW DECLARE cnt NUMBER := 10;
      biggestID NUMBER;
      BEGIN
        SELECT MAX(exemplar_id) INTO biggestID FROM exemplar;
        INSERT
        INTO livro
          (
            id_livro,
            nome_livro,
            id_editora,
            ano,
            Preco_Aluguer,
            Preco_Compra,
            Preco_Multa
          )
          VALUES
          (
            :new.id_livro,
            :new.nome_livro,
            :new.id_editora,
            :new.ano,
            :new.Preco_Aluguer,
            :new.Preco_Compra,
            :new.Preco_Multa
          );
        WHILE cnt > 0
        LOOP
          BEGIN
            biggestID := biggestID + 1;
            INSERT
            INTO exemplar
              (
                id_exemplar,
                id_livro
              )
              VALUES
              (
                biggestID,
                :new.id_livro
              );
            cnt := cnt - 1;
          END;
        END LOOP;
      END; 
    

    问题:

    你不能使用这个语法:SET biggestID = biggestID + 1

    您需要使用:biggestID := biggestID + 1;

    请注意,SET 关键字已被删除,= 已更改为 :=,并且该行已以分号结束。

    另外,没有:new.biggestID 这样的东西。这是您在触发器中定义的变量。只需将其替换为 biggestID

    最后,这个块周围的BEGINEND 被替换为LOOPEND LOOP

     SET biggestID = biggestID + 1
          INSERT INTO exemplar (
                      id_exemplar,
                      id_livro
                      )
          VALUES      (
                      :new.biggestID,
                      :new.id_livro
                      );
          SET cnt = cnt - 1
    

    【讨论】:

      猜你喜欢
      • 2017-03-12
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2015-08-06
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多