【问题标题】:Select inside an insert into.. values(...)在插入中选择.. values(...)
【发布时间】:2014-11-21 20:47:50
【问题描述】:

我有这段 sql 代码。它是一个触发器,当 ORDER_SERVICE 中的状态更改插入到名为 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;

它基本上是一个连接。我在ORDEM_SERVICO 中有MATRICULA 作为FOREIGN KEY,在VEICULO 作为主键。我在VEICULO 中也有(并且需要)CODIGO_CLIENTE,因此加入。但是它抱怨我在 VALUES 中所做的选择。请问有什么解决办法吗?

【问题讨论】:

    标签: sql oracle plsql sql-insert


    【解决方案1】:

    只需将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 仅返回一行和一列。

    【讨论】:

    • 这行得通,但我已经简单地声明了变量并选择了它们,也行得通,只是把它作为一个选项放在那里!
    • @Forget 当select 语句返回多行时,此insert 语句将失败。这不是构造语句的好方法。最好在查询的选择列表中简单地包含SEQ_SMS.NEXTVAL 并完全省略插入语句的values 子句。其次,在您的触发器中,您尝试从定义触发器的表(ORDEM_SERVICO)中进行选择-您将遇到table is mutating 错误。
    • 它不会返回超过一行,因为它是主键,因此只有一行。关于错误,您能更好地解释一下吗?我编译了,没有返回任何错误,会在触发器“触发”时发生吗?
    • @Forget 如果您想在另一个查询中使用select 查询,则始终必须将 int 括在括号中。如果你不这样做,你会得到一个语法错误
    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 2018-02-18
    • 2014-02-02
    • 1970-01-01
    • 2021-02-17
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多