Хммм... этот оператор 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