Если ВЫБРАТЬ «string» В var1 с параметром WHERE, не возвращающим строк, строка все равно перемещается в var1?

#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
 

Но, серьезно, вам нужно найти способ протестировать разработки в вашей рабочей среде.

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