2

我正在编写一个存储过程。我知道如何将值从selectinto传递给insert.

但是,是否可以同时INSERT INTO使用valuesSelect

Insert into table_1 (f1, f2, f3, f4, f5, f6, f7, f8, f9,
      FL1, FL2, FL3)

      Select :p_f1, :v_f2, :p_f3, :p_f4,
        abs(:v_f5 * :p_f5),
        abs(:v_f6 * :p_f6),
        :v_f7, :v_f8, :v_9 from RDB$DATABASE
      UNION
      Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id1)
      UNION
      Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id2)
      UNION
      Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id3);
4

1 回答 1

5

我猜你想使用语句的结果集作为SELECT语句的输入INSERT?是的,这是可能的,请参阅FB 的语言参考。可能导致您的问题的部分是您在这种情况下不使用VALUES关键字,该语句看起来像

INSERT INTO table (fields) SELECT ...

或者,如果您想在一个语句中同时拥有“常量值”(如INSERT INTO ... VALUES(...)语句)和“动态值”(使用SELECT语句作为源),那么您可以将它们合并,即

INSERT INTO table (fields)
     SELECT fields FROM tab_src ...
   UNION
     SELECT constants FROM RDB$DATABASE

其中constants是适当类型的值列表。


更新

好的,我想你想要的实际上是这样的

Insert into table_1 (f1, f2, f3, f4, f5, f6, f7, f8, f9, FL1, FL2, FL3)
VALUES(:p_f1, :v_f2, :p_f3, :p_f4,
        abs(:v_f5 * :p_f5),
        abs(:v_f6 * :p_f6),
        :v_f7, :v_f8, :v_9,
        (Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id1)),
        (Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id2)),
        (Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id3))
)
于 2012-01-04T05:07:27.830 回答