Unlike COBOL, SQL supports variables that can contain null values. A null value means that no entry has been made and usually implies that the value is either unknown or undefined. A null value enables you to distinguish between a deliberate entry of zero (for numerical columns) or a blank (for character columns) and an unknown or inapplicable entry. For example, a null value in a price column does not mean that the item is being given away free, it means that the price is not known or has not been set.
Indicator variables serve an additional purpose if truncation occurs when data is retrieved from a database into a host variable. If the host variable is not large enough to hold the data returned from the database, the warning flag sqlwarn1 in the SQLCA data structure is set and the indicator variable is set to the size of the data contained in the database.
Indicator variables are always defined as:
pic S9(4) comp-5.
:hostvar:indicvar
or
:hostvar INDICATOR :indicvar
This example demonstrates the declaration of an indiator variable that is used in a FETCH ...INTO statement.
EXEC SQL BEGIN DECLARE SECTION END-EXEC 01 host-var pic x(4). 01 indicator-var pic S9(4) comp-5. EXEC SQL END DECLARE SECTION END-EXEC . . . EXEC SQL FETCH myCursor INTO :host-var:indicator-var END-EXEC
The following shows an embedded UPDATE statement that uses a saleprice host variable with a companion indicator variable, saleprice-null:
EXEC SQL UPDATE closeoutsale SET temp_price = :saleprice:saleprice-null, listprice = :oldprice END-EXEC
In this example, if saleprice-null has a value of -1, when the UPDATE statement executes, the statement is read as:
EXEC SQL UPDATE closeoutsale SET temp_price = null, listprice = :oldprice END-EXEC
This example demonstrates the use of the is null construct to do a search:
if saleprice-null equal -1 EXEC SQL DELETE FROM closeoutsale WHERE temp_price is null END-EXEC else EXEC SQL DELETE FROM closeoutsale WHERE temp_price = :saleprice END-EXEC end-if