我对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);