创建触发器时出错
Posted
技术标签:
【中文标题】创建触发器时出错【英文标题】:Error creating trigger 【发布时间】:2011-01-16 19:21:06 【问题描述】:我创建了以下表格:
CREATE TABLE PILOTO_COPILOTO (
nip number,
anos_experienciencia float)
TABLESPACE TSPROYECTOABD;
和
CREATE TABLE TRIPULACION (
nip number,
nombre varchar(20),
apellido varchar(20),
fecha_nac date,
fecha_contratacion date,
sexo char,
idiomas varchar(50),
nacionalidad varchar(20))
TABLESPACE TSPROYECTOABD;
并创建了以下触发器以将一行插入到 TRIPULACION 中,对应于 PILOTO_COPILOTO 中的新行。
create or replace
TRIGGER anadir_tripulacion
AFTER INSERT OR UPDATE ON PILOTO_COPILOTO
REFERENCING NEW AS newRow
FOR EACH ROW
BEGIN
INSERT INTO TRIPULACION VALUES(:newRow.NIP);
END anadir_tripulacion;
尝试使用 PILOTO_COPILOTO 的 nip 字段更新 TRIPULACION 表时出现以下错误。
Error(7,9): PL/SQL: SQL Statement ignored
Error(7,21): PL/SQL: ORA-00947: not enough values
为什么?
【问题讨论】:
【参考方案1】:如果直接使用INSERT INTO VALUES(...)
,则必须指定表的所有列。
您可以像这样精确地插入数据的列。
INSERT INTO TRIPULACION (nip) VALUES(:newRow.NIP);
【讨论】:
【参考方案2】:INSERT INTO TRIPULACION VALUES(:newRow.NIP);
>> Error(7,21): PL/SQL: ORA-00947: not enough values
这是因为当你省略列列表时,意味着你正在插入完整的列列表,所以你写的是真的
INSERT INTO TRIPULACION
(nip, nombre, apellido, fecha_nac, fecha_contratacion,
sexo, idiomas, nacionalidad)
VALUES
(:newRow.NIP);
因此很明显,您有 8 列要插入,但提供了 1 个值。
【讨论】:
以上是关于创建触发器时出错的主要内容,如果未能解决你的问题,请参考以下文章