2014-11-21 56 views
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; 

它基本上是一个连接。我有MATRICULAORDEM_SERVICO作为FOREIGN KEYVEICULO作为PRIMARY KEY。我也有CODIGO_CLIENTE(需要)VEICULO,因此加入。它抱怨着我在VALUES中做的选择。任何解决方案,请吗?

回答

3

只需附上select用括号:

INSERT INTO SMS(N_SMS, CODIGO_CLIENTE) 
    VALUES (SEQ_SMS.NEXTVAL 
      , (SELECT CODIGO_CLIENTE 
       FROM ORDEM_SERVICO, VEICULO 
       WHERE ORDEM_SERVICO.MATRICULA = VEICULO.MATRICULA) 
      ) 

此外,还要确保select只返回一行和一列。

+0

这工作,但我已经简单地声明变量和选择到他们,也工作,只是把它作为一个选项也是! – Forget 2014-11-21 21:16:33

+1

@Forget当'select'语句返回多行时,这个'insert'语句将失败。这不是构建声明的各种好方法。在查询的选择列表中简单地包含'SEQ_SMS.NEXTVAL'并且完全省略插入语句的'values'子句将会更好。其次,在你的触发器中,你试图从表中选择触发器('ORDEM_SERVICO') - 你将触发'table is mutating'错误。 – 2014-11-21 22:03:34

+0

它不会返回多于一行,因为它是主键,因此只有一行。关于这个错误,你能解释一下吗?我编译并没有返回任何错误,当触发器“触发”时会发生吗? – Forget 2014-11-22 16:40:35