创建触发器时出错

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 个值。

【讨论】:

以上是关于创建触发器时出错的主要内容,如果未能解决你的问题,请参考以下文章

创建 SQL 触发器以更新另一个表时出错

使用 PL/SQL 块创建触发器时出错

运行触发器时出错

在 Greenplum 中使用触发器时出错

在oracle中插入表B后创建触发器以将新行添加到表A中时出错

表正在变异,触发器/函数可能看不到它/ORA-04088: 执行触发器时出错