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.