奇怪的PLSQL编译错误

时间:2018-03-22 14:27:31

标签: oracle plsql triggers compiler-errors

我对Oracle SQL很陌生,我试图解决一个练习,我必须编写一个触发器来对某些表进行更新。问题是我有编译错误,我无法弄清楚如何解决。我尝试了一些搜索,但没有得到任何有用的解决方案,所以,如果有人可以帮助我并解释如何修复并避免将来的错误,我将不胜感激:)

错误堆栈:

Errore(15): PLS-00707: unsupported construct or internal error [2604]
Errore(18,1): PL/SQL: SQL Statement ignored
Errore(18,15): PL/SQL: ORA-06544: PL/SQL: internal error, arguments: [2604], [], [], [], [], [], [], []
Errore(22,6): PLS-00801: internal error [20803]
Errore(22,6): PL/SQL: Item ignored
Errore(27,1): PL/SQL: SQL Statement ignored
Errore(27,25): PLS-00320: the declaration of the type of this expression is incomplete or malformed
Errore(31,5): PL/SQL: SQL Statement ignored
Errore(31,17): PL/SQL: ORA-06544: PL/SQL: internal error, arguments: [2604], [], [], [], [], [], [], []

代码:

/*ALTER TABLE POS_GP ADD TEMPO INTERVAL DAY(0) TO SECOND(3);
RENAME POS_GP TO POS_GP_BASE;
CREATE OR REPLACE VIEW POS_GP AS
SELECT * FROM POS_GP_base;
*/
CREATE     OR REPLACE TRIGGER best_pos INSTEAD OF
    INSERT ON pos_gp
    FOR EACH ROW
DECLARE
    CURSOR non_rispetta IS SELECT *
                             FROM pos_gp_base
                            WHERE numero_gp =:new.numero_gp
       AND (
        (
            posizione <:new.posizione
               AND tempo >:new.tempo
        )
            OR (
            posizione >:new.posizione
               AND tempo <:new.tempo
        )
    );

    riga       non_rispetta%rowtype;
    newpunti   puntif1.punteggio%TYPE;
BEGIN
    OPEN non_rispetta;
    FETCH non_rispetta   INTO riga;
    IF
        non_rispetta%found
    THEN
        raise_application_error(-20003,'Tempo o posizione errati');
    ELSE
        INSERT   INTO pos_gp_base VALUES (
            :new.numero_gp,
            :new.pilota,
            :new.posizione,
            :new.tempo
        );

    END IF;

    CLOSE non_rispetta;
    SELECT punteggio
      INTO newpunti
      FROM puntif1
     WHERE pos =:new.posizione;

    UPDATE pilotaf1
       SET
        punti = punti + newpunti
     WHERE nro_vettura =:new.pilota;

    UPDATE scuderia
       SET
        punti = punti + newpunti
     WHERE id_s =:new.pilota;

END;

所涉及的其他表格的代码:

CREATE TABLE Scuderia
( 
  id_S INTEGER,
  Nome VARCHAR2(50) NOT NULL,
  Punti NUMBER NOT NULL,
  CONSTRAINT sc_pk PRIMARY KEY(id_S)
);

CREATE TABLE PilotaF1
(
 Nro_vettura INTEGER,
 Nome VARCHAR2(50) NOT NULL,
 id_scuderia INTEGER,
 Punti NUMBER NOT NULL,
 CONSTRAINT pilo_pk PRIMARY KEY(Nro_vettura),
 CONSTRAINT pilo_fk FOREIGN KEY(id_scuderia) REFERENCES Scuderia(id_S)
);

CREATE TABLE Pos_GP
(
 Numero_GP INTEGER,
 Pilota INTEGER,
 Posizione INTEGER NOT NULL,
 CONSTRAINT pos_pk PRIMARY KEY(Numero_GP,Pilota),
 CONSTRAINT pos_fk FOREIGN KEY(Pilota) REFERENCES PilotaF1(Nro_vettura)
);
--Starting here, this code was given to me as part of the exercise
CREATE TABLE "PUNTIF1" 
 (
  "POS" NUMBER(2,0), 
  "PUNTEGGIO" NUMBER(2,0) DEFAULT 0
 ) 
/   

REM INSERTING into PUNTIF1
SET DEFINE OFF;
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('1','25');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('2','18');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('3','15');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('4','12');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('5','10');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('6','8');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('7','6');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('8','4');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('9','2');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('10','1');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('11','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('12','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('13','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('14','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('15','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('16','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('17','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('18','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('19','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('20','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('21','0');
Insert into PUNTIF1 (POS,PUNTEGGIO) values ('22','0');


ALTER TABLE "PUNTIF1" ADD CONSTRAINT "PUNTIF1_PK" PRIMARY KEY ("POS") ENABLE;
ALTER TABLE "PUNTIF1" MODIFY ("PUNTEGGIO" NOT NULL ENABLE);

0 个答案:

没有答案