Устранение неполадок в коде .sql, который выполняется в sqldeveloper, но никогда не завершается, когда помещается в командный файл - PullRequest
1 голос
/ 18 апреля 2019

У меня есть командный файл, который запускает несколько файлов .sql с помощью команды sqlplus. Я сталкиваюсь с проблемой, когда один из файлов .sql зависает и заставляет меня завершить пакетную работу.

Я не обнаружил код ошибки, но я позволил пакетному файлу работать более 12 часов на этой части безуспешно. Когда я вручную запускаю этот файл .sql в sqldeveloper, он заканчивается примерно через 2 минуты. SQL-код - это оператор вставки, который вставляет менее 400 тыс. Строк с 5 столбцами. Первоначально этот код был частью большого файла .sql, в который было вставлено 4 оператора вставки в одну и ту же таблицу, но я разделил каждый оператор вставки в отдельный файл и шаг в пакетном файле, чтобы попытаться устранить проблему. Остальные 3 файла запускаются без проблем и во время, аналогичное запуску вручную.

Я попытался изменить порядок запуска и сделать этот код отдельным отдельным пакетным файлом, но это не помогло.

Код начинается с оператора объявления с несколькими переменными, а затем:

BEGIN
    SELECT VARIABLE INTO DECLARED VARIABLE
    FROM TABLE;
etc...

, что он делает для всех файлов sql в командном файле. Затем он имеет оператор IF (с тем же тестом, что и у других файлов sql), за которым следует:

  THEN
       INSERT INTO TABLE (
            SELECT VAR1,
                   VAR2,
                   CASE WHEN COLUMN1 IS NOT NULL AND COLUMN2 IN (VALUE)
                            THEN COLUMN1 || 'D' || RNK
                        ELSE COLUMN1
                       END AS VAR3
            FROM( SUBQUERIES );

Для «SUBQUERIES» он имеет вложенные подзапросы, которые оставляются присоединенными и внутренне объединенными с другими подзапросами. Я считал, что этот шаг может быть слишком сложным и вызывать ошибку, но не уверен.

Завершает IF-THEN оператором COMMIT, после которого следует:

   ELSE
       NULL;
   END IF;
END;

Единственное, что изменяется между 4 файлами - это операторы вставки. Как устранить неполадки, чтобы выяснить, что вызывает их зависание в командном файле, а не в sqldeveloper.

1 Ответ

1 голос
/ 18 апреля 2019

Одна из причин, по которой он не завершается, особенно если он выполняется дольше, чем ожидалось, может заключаться в том, что существует другой сеанс, блокирующий его завершение. Решение для запроса здесь: Поиск запроса от оракула, который блокирует сеанс

Вы также можете проверить, что запрос по какой-то причине еще не запущен. Хотя это кажется маловероятным, если вы уже тестировали тот же самый скрипт в SQL Dev. Как проверить базу данных Oracle на длительные запросы

Кроме того, чехол ELSE NULL можно снять. Он ничего не делает и для IF не требуется предложение ELSE.

...