2016-12-16 16 views
1

Давайте предположим, что у нас есть этот запрос:DB2 встроенный SQL в RPGLE

SELECT T1.*, T2.* INTO :DS1, :DS2 FROM FILE1 AS T1 
LEFT JOIN FILE2 AS T2 ON T1.KEY = T2.KEY 
FETCH FIRST 1 ROW ONLY 

Все идет вверх хорошо, если обе записи найдены. Но что произойдет, если нет записи FILE2?

SQLCOD -305 THE NULL VALUE CANNOT BE ASSIGNED TO OUTPUT HOST VARIABLE 

И даже если запись из FILE1 найдена, оба DS пустые! Это проблема.
Способом преодоления этого является использование COALESCE на каждом поле, но что, если у меня есть сотни?
Другой способ - использовать два разных запроса. Но это некрасиво, если мне нужен курсор.

Есть ли лучший способ?

+0

Если либо присутствует, замените свой ЛЕВЫЙ ПРИСОЕДИНЯЙТЕ С ВНУТРЕННЕГО СОЕДИНЕНИЯ –

+0

Запись FILE2 не требуется. Но запись FILE1 необходима. – LppEdd

ответ

3

Если у вас есть столбцы, которые могут быть NULL, вам необходимо передать целочисленную переменную, которая будет использоваться как индикатор NULL. Тогда, если значение для столбца результата равно null, SQL помещает -1 в индикаторную переменную.

С ЛЕВЫМ СОЕДИНЕНИЕМ каждый столбец с правой таблицы может быть NULL.

manual имеет следующий пример:

EXEC SQL 
    SELECT COUNT(*), AVG(SALARY) 
    INTO :PLICNT, :PLISAL:INDNULL 
    FROM CORPDATA.EMPLOYEE 
    WHERE EDLEVEL < 18 

Обратите внимание, что нет запятой между нулем и способным PLISAL INDNULL.

При работе с структурами данных вы можете передать нулевой индикаторный массив. Таким образом, вы код должен быть что-то вроде:

// xx should be the number of columns in T2 
dcl-s indArr int(5) dim(xx); 

exec sql 
    SELECT T1.*, T2.* INTO :DS1, :DS2 :indArr 
    FROM FILE1 AS T1 
    LEFT JOIN FILE2 AS T2 ON T1.KEY = T2.KEY 
    FETCH FIRST 1 ROW ONLY; 

В качестве FYI: это считается плохой идеей использовать SELECT * в производстве код. Вы должны иметь явный список столбцов. Таким образом, кто-то может прийти позже и добавить столбец к таблице, не нарушая ваш код.

+0

Вот и все! Удивительно, как всегда! И вы правы в использовании отдельных столбцов, но с ограничением 80 символов, сотни полей становятся немного утомительными! – LppEdd

+0

@LppEdd, это не так сложно создать список имен столбцов, разделенных запятыми. Если ничего больше, вы можете получить список или столбцы в текстовом редакторе и заменить CRLF запятой. – Charles