1
我有这块sql代码。当ORDER_SERVICE中的STATE被改变时,它是一个触发器,它被插入一个名为sms的sms_number(它是一个序列)和CODIGO_CLIENTE中。我有这个:在插入内部选择.. ..值(...)
create or replace TRIGGER ENVIAR_SMS
AFTER UPDATE ON ORDEM_SERVICO
FOR EACH ROW
BEGIN
IF UPDATING
THEN
IF (NOT :NEW.ESTADO = :OLD.ESTADO)
THEN
INSERT INTO SMS(N_SMS, CODIGO_CLIENTE)
VALUES (SEQ_SMS.NEXTVAL, SELECT CODIGO_CLIENTE
FROM ORDEM_SERVICO,
VEICULO
WHERE ORDEM_SERVICO.MATRICULA=VEICULO.MATRICULA);
END IF;
END IF;
END;
它基本上是一个连接。我有MATRICULA
在ORDEM_SERVICO
作为FOREIGN KEY
和VEICULO
作为PRIMARY KEY。我也有CODIGO_CLIENTE
(需要)VEICULO
,因此加入。它抱怨着我在VALUES中做的选择。任何解决方案,请吗?
这工作,但我已经简单地声明变量和选择到他们,也工作,只是把它作为一个选项也是! – Forget 2014-11-21 21:16:33
@Forget当'select'语句返回多行时,这个'insert'语句将失败。这不是构建声明的各种好方法。在查询的选择列表中简单地包含'SEQ_SMS.NEXTVAL'并且完全省略插入语句的'values'子句将会更好。其次,在你的触发器中,你试图从表中选择触发器('ORDEM_SERVICO') - 你将触发'table is mutating'错误。 – 2014-11-21 22:03:34
它不会返回多于一行,因为它是主键,因此只有一行。关于这个错误,你能解释一下吗?我编译并没有返回任何错误,当触发器“触发”时会发生吗? – Forget 2014-11-22 16:40:35