Sets up a record stream consisting of segments from a segmented
string field. Because a single segmented string field value is
made up of multiple segments, a record stream that includes
a segmented string field is nested. The outer loop retrieves
records that include the segmented string field and the inner
loop retrieves the segments from this field, one at a time.
Therefore, a FOR statement that retrieves segmented strings must
be nested within a START_STREAM or FOR statement.
1 – Examples
The following programs demonstrate the use of the FOR statement
to retrieve segmented strings. Since the PERSONNEL database does
not have any segmented strings stored, the programs first store
three strings in the RESUME field of the RESUMES relation (for
more information on storing segmented strings, see the help entry
on STORE Statement with segmented strings). The programs retrieve
the segmented strings using a nested FOR statement. The outer FOR
statement selects a record based on EMPLOYEE_ID. The inner FOR
statement prints each segmented string stored in RESUME for the
selected employee.
1.1 – C Example
#include <stdio.h>
DATABASE PERS = FILENAME "PERSONNEL";
main()
{
int line;
char *document[3];
document[0] = "first line of resume ";
document[1] = "second line of resume ";
document[2] = "last line of resume ";
READY PERS;
START_TRANSACTION READ_WRITE;
STORE R IN RESUMES USING
strcpy (R.EMPLOYEE_ID,"12345");
for (line = 0; line <= 2; line++)
STORE SEG IN R.RESUME
strcpy(SEG.VALUE,document[line]);
SEG.LENGTH = strlen(SEG.VALUE);
END_STORE;
END_STORE;
FOR R IN RESUMES WITH R.EMPLOYEE_ID = "12345"
FOR SEG IN R.RESUME
printf("%s\n",SEG.VALUE);
END_FOR;
END_FOR;
COMMIT;
FINISH;
}
1.2 – Pascal Example
program segstr (input,output);
DATABASE PERS = FILENAME 'PERSONNEL';
type lines = varying [80] of char;
var linecnt : integer;
document : array [0..2] of lines;
begin
document[0] := 'first line of resume ';
document[1] := 'second line of resume ';
document[2] := 'last line of resume ';
READY PERS;
START_TRANSACTION READ_WRITE;
STORE R IN RESUMES USING
R.EMPLOYEE_ID:= '12345';
for linecnt := 0 to 2 do
STORE SEG IN R.RESUME
SEG := document[linecnt];
SEG.LENGTH := length(document[linecnt]);
END_STORE;
END_STORE;
FOR R IN RESUMES WITH R.EMPLOYEE_ID = '12345'
FOR SEG IN R.RESUME
writeln (SEG);
END_FOR;
END_FOR;
COMMIT;
FINISH;
end.
2 – Format
(B)0[m[4mFOR[m qq> ss-handle qqq> [4mIN[m qqqq> ss-field qqqqqwq>qqqqqqqqqqqqwqk
mq> on-error qqj x
lqqqqqqqqqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
mqqqq> assignment qqqqqqqqq> [4mEND_FOR[m
2.1 – Format arguments
ss-handle A name that identifies the segmented
string.
ss-field A qualified field name that refers to a
field defined with the SEGMENTED STRING
data type. Note that this field name, like
all field names in a FOR statement, must
be qualified by its own context variable.
This second context variable must match
the variable declared in the outer FOR
statement. See the Examples entry.
on-error The ON ERROR clause. Specifies host
language statement(s) to be performed
if an error occurs during the FOR loop.
For more information see the entry on ON
ERROR.
assignment Associates the two database variables with
a value expression. The database variables
refer to the segment of a segmented string
and its length. The special name for
the segment can be either "VALUE" or
"RDB$VALUE". The special name for the
segment length can be either "LENGTH"
or "RDB$LENGTH". You cannot assign any
other database variables to the value
expressions for segmented strings. The
assignment operator for RDML Pascal is
":=" and for RDML C is "=" or strcpy.