oracle - 触发器成功编译但未触发
问题描述
我正在制作一个支持“卡坦定居者”原始版本的数据库,虽然其中大部分都按预期工作,但这个触发器却没有。
我正在通过 SQL Developer 开发 Oracle 18c,与 Netbeans 一起开发相关的 Java 应用程序(这将在另一个问题中讨论)。
这些是涉及的表:
CREATE TABLE giocatore(
numero INT,
colore VARCHAR2(20),
punto_partenza INT,
punti_vittoria INT DEFAULT 0,
vittorioso CHAR(1) DEFAULT 'f',
quant_clay INT,
quant_wool INT,
quant_wheat INT,
quant_wood INT,
quant_rock INT,
CONSTRAINT player_pk PRIMARY KEY(numero)
);
CREATE TABLE esagono(
numero INT,
tipo VARCHAR2(30),
terreno VARCHAR2(10),
punti_vittoria INT,
gettone INT,
matprod VARCHAR2(20),
quant_mat INT,
occupato_da INT,
occupato_in_turno INT,
CONSTRAINT hexa_pk PRIMARY KEY(numero),
CONSTRAINT ocp_fk FOREIGN KEY(occupato_in_turno) REFERENCES turno (numero_turno),
CONSTRAINT mat_fk FOREIGN KEY(matprod) REFERENCES materia_prima (tipo),
CONSTRAINT occ_fk FOREIGN KEY(occupato_da) REFERENCES giocatore (numero)
);
CREATE TABLE materia_prima(
tipo VARCHAR2(20),
quantita INT,
CONSTRAINT type_pk PRIMARY KEY(tipo)
);
CREATE TABLE turno(
numero_turno INT,
val_dadi INT,
CONSTRAINT turn_pk PRIMARY KEY(numero_turno)
);
这是触发器本身:
create or replace TRIGGER generate_prime
AFTER INSERT ON turno
DECLARE valextracted INT; produced esagono.matprod%TYPE; quantity INT; occupied esagono.occupato_da%TYPE;
BEGIN
SELECT val_dadi
INTO valextracted
FROM turno
WHERE ROWNUM = 1
ORDER BY numero_turno DESC;
FOR record IN (SELECT matprod, quant_mat, occupato_da INTO produced, quantity, occupied FROM esagono WHERE gettone = valextracted)
LOOP
UPDATE materia_prima
SET quantita = quantita + quantity
WHERE tipo = produced;
IF produced = 'Argilla' THEN
UPDATE giocatore
SET quant_clay = quant_clay + quantity
WHERE numero = occupied;
ELSIF produced = 'Grano' THEN
UPDATE giocatore
SET quant_wheat = quant_wheat + quantity
WHERE numero = occupied;
ELSIF produced = 'Lana' THEN
UPDATE giocatore
SET quant_wool = quant_wool + quantity
WHERE numero = occupied;
ELSIF produced = 'Legno' THEN
UPDATE giocatore
SET quant_wood = quant_wood + quantity
WHERE numero = occupied;
ELSIF produced = 'Minerali' THEN
UPDATE giocatore
SET quant_rock = quant_rock + quantity
WHERE numero = occupied;
END IF;
END LOOP;
END;
我希望触发器根据 ESAGONO 的 quant_mat 更新 GIOCATORE 的 quant_clay/wool/wheat/wood/rock 行和 MATERIA_PRIMA 的 quantita 行,但这不会发生。有任何想法吗?
解决方案
我相信我已经找到了你的问题。您应该更换这部分:
FOR record IN (SELECT matprod
, quant_mat
, occupato_da
INTO produced
, quantity
, occupied
FROM esagono
WHERE gettone = valextracted)
LOOP
有了这个:
FOR record IN (SELECT matprod
, quant_mat
, occupato_da
FROM esagono
WHERE gettone = valextracted)
LOOP
produced := record.matprod;
quantity := record.quant_mat;
occupied := record.occupato_da;
这是有效的触发器:
create or replace TRIGGER generate_prime
AFTER INSERT ON turno
DECLARE
valextracted INT;
produced esagono.matprod%TYPE;
quantity INT;
occupied esagono.occupato_da%TYPE;
BEGIN
SELECT val_dadi
INTO valextracted
FROM turno
WHERE ROWNUM = 1
ORDER BY numero_turno DESC;
FOR record IN (SELECT matprod
, quant_mat
, occupato_da
FROM esagono
WHERE gettone = valextracted)
LOOP
produced := record.matprod;
quantity := record.quant_mat;
occupied := record.occupato_da;
UPDATE materia_prima
SET quantita = quantita + quantity
WHERE tipo = produced;
IF produced = 'Argilla' THEN
UPDATE giocatore
SET quant_clay = quant_clay + quantity
WHERE numero = occupied;
ELSIF produced = 'Grano' THEN
UPDATE giocatore
SET quant_wheat = quant_wheat + quantity
WHERE numero = occupied;
ELSIF produced = 'Lana' THEN
UPDATE giocatore
SET quant_wool = quant_wool + quantity
WHERE numero = occupied;
ELSIF produced = 'Legno' THEN
UPDATE giocatore
SET quant_wood = quant_wood + quantity
WHERE numero = occupied;
ELSIF produced = 'Minerali' THEN
UPDATE giocatore
SET quant_rock = quant_rock + quantity
WHERE numero = occupied;
END IF;
END LOOP;
END;
希望这可以帮助!
推荐阅读
- javascript - 流星无法解析某些模块
- r - 如何在 r 中将 PostgreSQL bytea 列十六进制解码为 int16/uint16?
- linux - 在 Linux 中线程化时对函数的未定义引用
- firebase - 类型的firestore数据库验证
- xaml - VisualState.Setters 中 Setter 的属性属性生成语法错误
- c# - C# Winforms ID 条码阅读器使用 ZXing.Net
- php - 4 个不同站点的按钮,但在每个 URL 的末尾输入了 1 个用户代码
- c - 在 C 中删除文件的一部分
- ios - 以编程方式调用时,自定义 xib 视图不可见
- java - Util 方法从集合创建地图