Firebird - используя Select и значения с помощью Insert в - PullRequest
2 голосов
/ 04 января 2012

Я пишу хранимую процедуру.Я знаю, как передать значения из select в insert.

Но возможно ли с INSERT INTO использовать values и Select одновременно?

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);

1 Ответ

5 голосов
/ 04 января 2012

Полагаю, вы хотите использовать результирующий набор оператора 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 - список значений соответствующего типа.


UPDATE

ОК, я думаю, что вы на самом деле хотите что-то вроде

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))
)
...