Что делает этот оператор SQL в этом коде Informix 4GL?

Я что-то упускаю. Пожалуйста, может кто-нибудь сказать мне, как это работает?

 let rpt.chgkey = null
  select cuschage.chgkey from cuschage where cuschage.cuschnum in
     (select shtwrd_no from crbookid where  
         crbookid.book_no = rpt.book_no and crbookid.line_no <= 3)

    let scratch = rpt.chgkey
    call make_charge_section(scratch) returning rpt.chgkey
 if rpt.chgkey is not null then
    print
    column 1, ESC, "(s0p12h0s3b4099T", ESC, "&a0.5R"
    print
    column 70, rpt.chgkey using "<<<<<<<<<"
end if

person MJJ3    schedule 30.08.2012    source источник


Ответы (1)


Хммм... этот оператор SELECT близок к бессмысленности. Обычно вы* выполняете оператор SELECT, чтобы получить данные в переменные, но нет предложения INTO, в которое можно поместить возвращаемое значение.

Учитывая, что SELECT ничего не делает с rpt.chgkey, значение в scratch равно NULL. Функция make_charge_section вызывается с этим значением (NULL), и результат сохраняется в rpt.chgkey; CALL эквивалентно:

LET rpt.chgkey = make_charge_section(scratch)

или вы можете обойтись без переменной нуля и написать:

LET rpt.chgkey = make_charge_section(rpt.chgkey)

(и вы можете сделать это и с нотацией CALL).

После этого вы отображаете на своем терминале какую-то странную управляющую последовательность — я не собираюсь выяснять, какой терминал или что он делает; вы уверены, что не можете добиться такого же эффекта с самим I4GL? И затем вы отображаете новое (ненулевое) значение rpt.chgkey.

Итак, большие неизвестные здесь: «почему оператор SELECT написан без предложения INTO» и «что делает make_charge_section(), когда в качестве входного значения задано значение NULL»?


* «Ненормальное» использование SELECT без INTO будет зависеть от того, обнаружите ли вы ошибки в SQL. То, как это происходит, зависит от того, что у вас установлено для параметра WHENEVER ERROR.

person Jonathan Leffler    schedule 31.08.2012