Data Conversion |
|
< > SQL Data Types Table of Contents
InstantSQL data transfers between the application and the data source generally require two translations in each direction.
When
transferring data from a data source for columns of a result set or output
parameter values to the COBOL program, the driver that supports the data source
connection converts the data from the data source format to C format data. InstantSQL then converts the C format data
to RM/COBOL format data.
When
transferring data from the COBOL program to a data source from input
parameters, InstantSQL converts the data from RM/COBOL format data to C format
data. Then the driver that supports the
data source connection converts from C format data to the data source format.
For purposes of InstantSQL, COBOL numeric edited data items are considered to be numeric in the following discussions.
Because of the limitations of
SQL numeric data types, COBOL 30-digit precision is generally not
supported. For example, a BIGINT data
item supports 19 digits for signed items and 20 digits for unsigned items.
When transferring a NULL
value from the data source, the COBOL data item is set to all binary zero
characters (ALL X"00"), regardless of the data type of the column or
the COBOL data item. The associated
length indicator (specified in the SQL GET DATA or SQL BIND COLUMN statement)
is set to the value sql-Null-Data. The length
indicator value sql-Null-Data unambiguously indicates a NULL in the data source,
but a test for ALL X"00" in the COBOL data item can also be used to
check for NULL valued data in those cases where this is known not to be valid
result.
When transferring a COBOL
value that should be treated as NULL to the data source, the associated length
indicator (specified in the SQL BIND PARAMETER
statement) should be set to sql-Null-Data, in which
case the COBOL data item value is ignored and a NULL is sent to the data
source. The associated length indicator
is the only means of sending a NULL to the data source. There is no value of a COBOL data item that
will cause a NULL to be sent to the data source. (Except some data sources treat a zero length string as
equivalent to NULL in a VARCHAR data item as noted below.)
CHAR, DECIMAL, LONGVARCHAR, NUMERIC, and VARCHAR Data Conversions
When
transferring data from the data source to the COBOL program, the character
string received from the driver is stored in the COBOL data item as follows:
If
the COBOL data item is nonnumeric and right justified, left space padding or
truncation is provided as necessary.
If
the COBOL data item is nonnumeric and left justified, right space padding or
truncation is provided as necessary.
If
the COBOL data item is numeric, the character string is assumed to be a numeric
string (optional leading sign, digits, and an optional embedded decimal point),
which is converted to an algebraic value and stored in the numeric data
item. For numeric edited data items,
the algebraic value is edited into the data item as it is stored. Truncation will occur if the algebraic value
is too large for the receiving data item.
When
truncation occurs, InstantSQL sets sqe-DataTruncation to true unless a more serious error also occurs. Data truncation errors will occur even if
the truncated characters are all spaces.
The
driver supporting the data source is responsible for converting DECIMAL and
NUMERIC data to character strings.
The
length indicator value returned for result columns and output parameters
indicates the length of the character string returned, without regard to any
truncation or space padding. A length
indicator value of zero indicates a zero length string. A length indicator value of sql-Null-Data indicates a NULL in the data source.
When
transferring data from the COBOL program to the data source, a numeric data
item is first converted to a numeric string.
The resulting string, or, for nonnumeric items, the original string, is
stripped of trailing spaces. The driver
then transfers this string to the data source.
The driver is responsible for padding a string value that is shorter
than the fixed length of a CHAR data item with spaces. If trailing spaces are significant in a
variable length VARCHAR or LONGVARCHAR data item, the length indicator may be
set to a value that includes the space characters and the driver will pad the
string with spaces to the length specified.
Alternatively, a X"00" character may be inserted in the COBOL
string after the last significant space and the length indicator set to sql-NTS, indicating a null terminated string. A length indicator value of sql-NTS is assumed when OMITTED is specified for the length
indicator COBOL argument in the SQL BIND PARAMETER
statement. If the supplied data length,
as determined by this discussion, is too large for the data source item,
InstantSQL sets sqe-DataTruncation to true unless a more serious error also occurs. A length indicator value of sql-Null-Data indicates that the COBOL data item value is to be
ignored and a NULL value sent to the data source.
Note When the resulting string from the COBOL
program is all spaces, InstantSQL normally strips all the trailing spaces, thus
giving an empty string. Some databases,
for example, Oracle, do not support an empty string, often by treating empty
strings as equivalent to NULL, which has different semantics than expected for
an empty string. InstantSQL provides
various solutions to this problem. The
application program may specify the length indicator with a value of 1 or
greater, in which case InstantSQL will preserve sufficient spaces to satisfy
the length indicator. Also, the
configuration values OracleVarCharMinSize
(for connections to Oracle databases) and VarCharMinSize (for
connections to databases other than Oracle) may be set to 1, which also causes
InstantSQL to preserve at least one space.
By default, OracleVarCharMinSize is 1 since all known Oracle databases
treat a zero length string as NULL.
(See the topic InstantSQL
Configuration for more information on configuring InstantSQL.)
Even
though DECIMAL and NUMERIC data types are grouped with character string data
types, these conversions preserve the algebraic value when such data items are
converted to/from numeric COBOL data items capable of holding the range of
values in the data source.
BINARY, LONGVARBINARY, and
VARBINARY Data Conversions
BINARY
data types in SQL do not generally represent numbers; instead, they are just
strings of binary data values, such as bit map images. Thus, it is usually incorrect for a COBOL
numeric argument to be used with these data types. Similarly, a right justified nonnumeric argument would usually be
incorrect.
When
transferring data from the data source to the COBOL program, the character
string received from the driver is stored in the COBOL data item as follows:
If
the COBOL data item is nonnumeric and right justified, left X"00"
padding or truncation is provided as necessary.
If
the COBOL data item is nonnumeric and left justified, right X"00"
padding or truncation is provided as necessary.
If
the COBOL data item is numeric, the character string is assumed to be a numeric
string (optional leading sign, digits, and an optional embedded decimal point),
which is converted to an algebraic value and stored in the numeric data
item. For numeric edited data items,
the algebraic value is edited into the data item as it is stored. Truncation will occur if the algebraic value
is too large for the receiving data item.
When
truncation occurs, InstantSQL sets sqe-DataTruncation to true unless a more serious error also occurs. Data truncation errors will occur even if
the truncated characters are all X"00".
The
length indicator value returned for result columns and output parameters
indicates the length in bytes of the binary data returned, without regard to
any truncation or X"00" padding.
A length indicator value of zero indicates a zero length data item. A length indicator value of sql-Null-Data indicates a NULL in the data source.
When
transferring data from the COBOL program to the data source, numeric data items
are first converted to a numeric string.
The driver then transfers the resulting string, or, for nonnumeric
items, the original string, to the data source. The length of the transfer will be controlled by the length
indicator value if a length indicator is associated with the item. No trailing bytes are stripped during the
transfer. The ODBC driver is
responsible for padding fixed length BINARY data with trailing binary zeroes. If the transferred data is too long for the
data source item, InstantSQL sets sqe-DataTruncation to true unless a more serious error also occurs. A length indicator value of sql-Null-Data indicates that the COBOL data item value is to be
ignored and a NULL value sent to the data source.
BIT Data Conversions
A
BIT data item generally represents true or false with the values 1 or 0,
respectively.
When
transferring data from the data source to the COBOL program, the value from the
data source is stored as an unsigned integer in the range 0 through 255 into
the COBOL data item. If the COBOL data
item is nonnumeric, the numeric value from the data source is converted to a
character string. If the data source
has properly represented a bit value, the only values returned will be 1 or 0
("1" or "0" for nonnumeric COBOL data items). A length indicator value of sql-Null-Data indicates a NULL in the data source; otherwise, the
length indicator will be 1 for BIT data.
When
transferring data from the COBOL program to the data source, if the COBOL data
item has a value of 0, a 0 is sent to the data source; otherwise, a 1 is sent
to the data source. If the COBOL data
item is nonnumeric, its value must be a string of decimal digits, which is
converted to a numeric value. A length
indicator value of sql-Null-Data indicates that the COBOL data item value is to be
ignored and a NULL value sent to the data source.
TINYINT, SMALLINT,
INTEGER, and BIGINT Data Conversions
When
transferring data from the data source to the COBOL program, the value from the
data source is stored into the COBOL data item. If the COBOL data item is nonnumeric, the numeric value from the
data source is converted to a character string. Result columns are treated as unsigned if the SQLColAttributes
function indicates they are unsigned.
Output parameters are treated as unsigned if their SQL data type is
unsigned for all data source supported data types that have the same SQL data
type (a data source may support multiple occurrences of the same SQL data
type); otherwise, the parameter is considered to be signed. For InstantSQL conversions from SQL data to
COBOL data, whether a data type is signed or unsigned only matters for TINYINT,
SMALLINT, INTEGER and BIGINT data types.
A length indicator value of sql-Null-Data
indicates a NULL in the data source; otherwise, the length indicator will be 1
for TINYINT, 2 for SMALLINT, 4 for INTEGER or 8 for BIGINT data.
When
transferring data from the COBOL program to the data source, the numeric value
of the COBOL data item is sent to the data source. If the COBOL data item is nonnumeric, its value must be a string
of decimal digits, which is converted to a numeric value. A data truncation error will occur if the
numeric value from the COBOL data item is outside the range for the data source
data item. Input parameters are treated
as unsigned if their SQL data type is unsigned for all data source supported
data types that have the same SQL data type (a data source may support multiple
occurrences of the same SQL data type); otherwise, the parameter is considered
to be signed. For InstantSQL
conversions from COBOL data to SQL data, whether a data type is signed or
unsigned only matters for TINYINT, SMALLINT and INTEGER data types (this
intentionally excludes BIGINT). A
length indicator value of sql-Null-Data indicates
that the COBOL data item value is to be ignored and a NULL value sent to the
data source.
Note Data truncation is not necessarily detected in all
cases. For example, the Access 97
driver does not detect truncation when values larger than 255 are transferred
to a column with the data type TINYINT.
Note RM/COBOL supports numeric data with up to 30 digits of
precision. In general, a precision
greater than 19 (20 for unsigned data) is not supported by databases, and that
is only when the BIGINT data type is supported. Thus, InstantSQL generally does not support this capability of
RM/COBOL.
DATE Data Conversions
The
COBOL data item must be:
nonnumeric
with a length of 8 or 7 characters; or
numeric
with a scale of zero and a precision of 8 or 7 digits.
When
the length or precision is 8, the COBOL data item will receive or must contain
a date in the form YYYYMMDD, where YYYY is a four-digit year, MM is a two-digit
month of the year, and DD is a two-digit day of the month. When the length or precision is 7, the COBOL
data item will receive or must contain a date in the form YYYYddd, where YYYY
is a four-digit year and ddd is a three-digit day of the year.
When
transferring data from the data source to the COBOL program, the value from the
data source is stored into the COBOL data item. If the COBOL data item is nonnumeric, the numeric value from the
data source is converted to a character string. A length indicator value of sql-Null-Data
indicates a NULL in the data source; otherwise, the length indicator will be 6
for DATE data.
When
transferring data from the COBOL program to the data source, the numeric value
of the COBOL data item is sent to the data source. If the COBOL data item is nonnumeric, its value must be a string
of decimal digits, which is converted to a numeric value. A data truncation error will occur if the
numeric value from the COBOL data item is outside the range for the data source
data item. The COBOL data item must
provide a value that represents a valid date in the Gregorian calendar. To indicate a NULL date, the length
indicator value must be set to sql-Null-Data; that is, a
date value of zero would cause a conversion error rather than a NULL valued
date.
TIME Data Conversions
The
COBOL data item must be:
nonnumeric
with a length of 2, 4, 6 or 8 characters; or
numeric
with a scale of zero and a precision of 2, 4, 6 or 8 digits.
The
COBOL data item will receive or must contain a time in the form HHmmSScc, where
HH is a two-digit hour of the day, mm is a two-digit minute of the hour, SS is
a two-digit second of the minute and cc is a two-digit centi-second of the
second. When the length or precision is
2, only the hours field is present, when 4, only the HHmm fields are present,
and so forth.
When
transferring data from the data source to the COBOL program, the time value
from the data source is stored into the COBOL data item according to the format
described for a COBOL time data item.
Since SQL time values do not contain centi-seconds, if the COBOL data
item includes the cc field, it will always be set to 00. If the COBOL time data item does not include
some or all of the time fields, these values are truncated without error. A length indicator value of sql-Null-Data indicates a NULL in the data source; otherwise, the
length indicator will be 6 for TIME data.
When
transferring data from the COBOL program to the data source, the time value of
the COBOL data item is validated and sent to the data source. If the validation fails, an error occurs and
the InstantSQL statement is terminated without sending the bad value to the
data source. The validation is that HH
must be 00-23, mm must be 00-59 and SS must be 00-61. (The range of seconds allows as many as two leap seconds to
maintain synchronization of sidereal time.)
Since SQL time values do not contain centi-seconds, if the COBOL data
item specifies centi-seconds, they will be truncated without error. If the COBOL time data item does not include
some or all of the time fields, zeroes are supplied to create the data source
time value. To indicate a NULL time,
the length indicator value must be set to sql-Null-Data.
TIMESTAMP Data Conversions
The
COBOL data item must be:
nonnumeric
with a length of 8, 10, 12, 14 or 16 characters; or
numeric
with a scale of zero and a precision of 7, 9, 11, 13 or 15 digits.
The
COBOL data item will receive or must contain a timestamp. If the length or precision is even, the
timestamp form is YYYYMMDDHHmmSScc, where YYYY is a four-digit year, MM is a
two-digit month of the year, and DD is a two-digit day of the month. If the length or precision is odd, the
timestamp form is YYYYdddHHmmSScc, where YYYY is a four-digit year and ddd is a
three-digit day of the year. In either
form, HH is a two-digit hour of the day, mm is a two-digit minute of the hour,
SS is a two-digit second of the minute and cc is a two-digit centi-second of
the second. When the length or
precision does not include space for the complete time portion of the
timestamp, time fields are truncated from the right without error. A minimal timestamp COBOL data item contains
only a date. A length indicator value
of sql-Null-Data indicates a
NULL in the data source; otherwise, the length indicator will be 16 for
TIMESTAMP data.
When
transferring data from the data source to the COBOL program, the timestamp
value from the data source is stored into the COBOL data item according to the
format described for a COBOL timestamp data item. If the COBOL timestamp data item does not include some or all of
the time fields, these values are truncated without error.
When
transferring data from the COBOL program to the data source, the timestamp
value of the COBOL data item is validated and sent to the data source. If the validation fails, an error occurs and
the InstantSQL statement is terminated without sending the bad value to the
data source. The validation is that the
date must be valid in the Gregorian calendar, HH must be 00-23, mm must be
00-59 and SS must be 00-61. (The range
of seconds allows as many as two leap seconds to maintain synchronization of
sidereal time.) If the COBOL timestamp
data item does not include some or all of the time fields, zeroes are supplied
to create the data source timestamp value.
To indicate a NULL timestamp, the length indicator value must be set to sql-Null-Data; that is, a date value of zero would cause a
conversion error rather than a NULL valued timestamp.
DOUBLE PRECISION, FLOAT,
and REAL Data Conversions
These
data types represent floating-point numbers, or, as they are called in
databases, approximate numeric values.
When
transferring data from the data source to the COBOL program, if the COBOL data
item is numeric, the value is stored into the numeric data item. If the COBOL data item is nonnumeric, the
value is converted to a string representation of a floating-point number and
the resulting string is copied to the COBOL nonnumeric data item. A length indicator value of sql-Null-Data indicates a NULL in the data source; otherwise, the
length indicator will be 8 for DOUBLE PRECISION or FLOAT data or 4 for REAL
data.
When
transferring data from the COBOL program to the data source, if the COBOL data
item is numeric, its value is converted to a floating-point number and this
number is sent to the data source. If
the COBOL data item is nonnumeric, it is assumed to contain a string
representation of a floating-point number, which is converted to the floating-point
value and this value is then sent to the data source. A length indicator value of sql-Null-Data
indicates that the COBOL data item value is to be ignored and a NULL value sent
to the data source.
A
string representation of a floating-point number is as follows:
[whitespace]
[sign] [digits] [.digits] [ {d | D | e
| E}[sign]digits]
A whitespace
may consist of space and tab characters, which are ignored; sign is
either plus (+) or minus (–); and digits are one or more
decimal digits. If no digits appear
before the radix character, at least one must appear after the radix
character. The decimal digits can be
followed by an exponent, which consists of an introductory letter (d, D,
e, or E) and an optionally signed integer. If neither an exponent part nor a radix character
appears, a radix character is assumed to follow the last digit in the
string. The first character that does
not fit this form stops the scan.
Copyright ©2000
Liant Software Corp. All rights
reserved.