#sql #variables #select
#sql #переменные #выберите
Вопрос:
MOVE "Y" TO :LKG-RETURN
EXEC SQL
SELECT "N"
INTO :LKG-RETURN
FROM SOME_TABLE
WHERE SOME_COLUMN = :SOME_VAR
END-EXEC.
Это часть программы SQLCOBOL, где мне нужно проверить некоторую переменную в базе данных, чтобы узнать, должна ли основная программа запускать или нет задание. По умолчанию я помещаю «Y» в возвращаемое значение, но если select возвращает строки, задание не должно выполняться, поэтому я вставляю в него «N». Мой вопрос:
Если select возвращает 0 строк (что означает, что задание должно быть запущено), все равно ли оно перемещает «N» в:LKG-RETURN ? Если это произойдет, каковы могут быть мои варианты для достижения желаемого результата?
Спасибо.
Комментарии:
1. Нет, для настройки теста, в котором я работаю, требуется время, и выполнение этого задания занимает около 2 часов, поэтому я должен быть уверен, проверять и перепроверять свои данные перед выполнением теста.
2. В вашей работе нет среды тестирования / разработки? Вы не можете настроить тестовую таблицу и попробовать ее на крошечном наборе данных? Что, если ваш код идеален, за исключением одной опечатки? Наверняка у вас есть какие-то возможности для тестирования?
3. Мне повезло получить замечательный Messy-Job-That-Collect-Data-From-Everywhere-To-Call-Tons-Many-Other-Jobs-But-Stop-If-One-Of-These-Jobs-Do-Not-Receive-Correct- Данные, которые были созданыв конце 80-х годов, когда не было установлено никаких норм, и на сегодняшний день около 50 разных программистов добавили что-то к этому. Настройка теста с моими собственными данными заняла бы около целого дня, чтобы собрать правильные данные. Если бы я мог сначала протестировать это, я бы не спрашивал об этом.
4. Я добавил ответ, который может быть или не быть полезным для вас. Но вам не нужно тестировать свой код на основе живой таблицы: создайте таблицу с 1 записью и протестируйте ее. Однако
CASE WHEN EXISTS
опция может выполняться быстрее для больших наборов данных (в зависимости от индексов, некачественности поля и т. Д. И т. Д.)
Ответ №1:
Нормальным поведением SQL было бы то, что значение НЕ возвращается. но я никогда не использовал SQLCOBOL, чтобы иметь возможность проверить это. И всякий раз, когда у меня возникают даже малейшие сомнения, я тестирую.
При отсутствии возможности тестирования это всегда будет возвращать значение…
SELECT COUNT(*)
INTO :LKG-RETURN
FROM SOME_TABLE
WHERE SOME_COLUMN = :SOME_VAR
-- 0 = no hits
Или, возможно…
SELECT
CASE WHEN EXISTS (SELECT * FROM SOME_TABLE WHERE SOME_COLUMN = :SOME_VAR)
THEN 'Y' ELSE 'N' END
Но, серьезно, вам нужно найти способ протестировать разработки в вашей рабочей среде.
Я не завидую тому, насколько сложно, должно быть, там, где вы работаете. Я надеюсь, что это сработает для вас.