Ошибка при использовании INSERT INTO внутри оператора CASE - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь вставить значения в таблицу внутри оператора CASE, но в моем INSERT INTO появляется ошибка "отсутствует выражение".

Как правильно использовать INSERT INTO в CASE? Вы можете найти код ниже. Я использую этот SELECT оператор в процедуре, и я помещаю результат этого в курсор.

SELECT
    COALESCE(a.file_type,b.file_type) AS file_type,a.input AS a_input,b.input AS b_input,a.output AS a_output,b.output AS b_output,
    CASE WHEN a.input = b.input THEN
              input_num+1
          WHEN a.input <> b.input THEN
          INSERT INTO diff_values(file_type,a_input,b_input,report_date)
              SELECT file_type,a.input,b.input FROM  test1 a, tset2 b WHERE 
              a.file_type=b.file_type
        WHEN a.output = b.output THEN 
              out_num+1
    END CASE
FROM
  test1 a, tset2 b
         WHERE a.file_type=b.file_type
         AND a.report_date=b.report_date;

1 Ответ

1 голос
/ 10 мая 2019
  • Нельзя встраивать оператор DML (например, INSERT) в запрос SQL.

  • Нельзя встраивать оператор CASE (который является PL / SQL) в запросе SQL.Однако вы можете встроить выражение CASE в запрос SQL, но выражение может только оценивать результат, оно не может включать PL / SQL (см. # 1 выше) *.

Результат, которого вы, похоже, хотите достичь, - запросить некоторые данные из двух таблиц (test1 и tset2), вычислить выражение и вставить результат обратно в те же таблицы, что иновые записи.Поскольку ваш конечный результат - INSERT, вы должны начать с этого, а затем создать запрос, который соберет необходимые для него данные, например:

INSERT INTO diff_values(file_type,a_input,b_input,report_date)
SELECT a.file_type,
       a.input,
       b.input,
       a.report_date
FROM test1 a, tset2 b
WHERE a.file_type=b.file_type
AND a.report_date=b.report_date
AND a.input <> b.input;

Обратите внимание, что я удалил COALESCE, потому что ГДЕПредложение гарантирует, что a.file_type и b.file_type в любом случае идентичны, поэтому вы можете просто сослаться на один из этих столбцов.

Теперь ваш исходный оператор также содержит следующие строки:

WHEN a.input = b.input THEN
     input_num+1
...
WHEN a.output = b.output THEN
      out_num+1

Я не знаю, что они должны делать, но я полагаю, что вы могли бы написать дополнительные запросы, чтобы обнаружить эти условия и вывести результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...