Preprocessor Input and Output
Regardless of the mode you use, the following files must be available
when you invoke the Pascal preprocessor, as shown in Figure 2-3 :
* source file: a file containing the Pascal ALLBASE/SQL program or
subprogram with embedded SQL commands for one DBEnvironment. The
file must be a fixed length ASCII file, numbered or unnumbered.
The formal file designator for this input file is:
SQLIN
* ALLBASE/SQL message catalog: a file containing preprocessor
messages and ALLBASE/SQL error and warning messages. The formal
file designator for the message catalog is as follows, with xxx
being the numeric representation for the current native language:
SQLCTxxx.PUB.SYS
When you run the preprocessor in full preprocessing mode, also
ensure that the DBEnvironment accessed by the program is
available.
As Figure 2-4 points out, the Pascal preprocessor creates the
following output files:
* modified source file: a file containing a modified version of the
source file. The formal file designator for this file is:
SQLOUT
After you use the preprocessor in full preprocessing mode, you use
SQLOUT and the following include files as input files for the
Pascal compiler, as shown in Figure 2-4.
* include files: include files containing definitions of constants,
types, variables, and external procedures used by Pascal
constructs the preprocessor inserts into SQLOUT. The formal file
designators for these files are, respectively:
SQLCONST
SQLTYPE
SQLVAR (or SQLVARn for subprograms)
SQLEXTN
* ALLBASE/SQL message file: a file containing the preprocessor
banner, warning messages, and other messages. The formal file
designator for this file is:
SQLMSG
* installable module file: a file containing a copy of the module
created by the preprocessor. The formal file designator for this
file is:
SQLMOD
When you run the preprocessor in full preprocessing mode, the
preprocessor also stores a module in the DBEnvironment accessed by your
program. The module is used at run time to execute DBEnvironment
operations.
If the source file is in a language other than ASCII, the modified source
file, and all generated files will have names in the native language and
extensions in ASCII.
Figure 2-3. Pascal Preprocessor Input and Output
Figure 2-4. Compiling Preprocessor Output
If you want to preprocess several ALLBASE/SQL application programs in the
same group and account and compile and link the programs later, or you
plan to compile a preprocessed program during a future session, you
should do the following for each program:
* Before running the preprocessor, equate SQLIN to the name of the
file containing the application you want to preprocess:
:FILE SQLIN = InFile
* After running the preprocessor, save and rename the output files
if you do not want them overwritten. For example:
:SAVE SQLOUT
:RENAME SQLOUT, OutFile
:SAVE SQLMOD
:RENAME SQLMOD, ModFile
:SAVE SQLVAR
:RENAME SQLVAR, VarFile
:SAVE SQLTYPE
:RENAME SQLTYPE, TypeFile
:SAVE SQLEXTN
:RENAME SQLEXTN, ExtnFile
:SAVE SQLCONST
:RENAME SQLCONST, ConstFile
When you are ready to compile the program, you must equate the include
file names to their standard ALLBASE/SQL names. See "Preprocessor
Generated Include Files" in this section for more information.
Source File
The source file must be a file that contains at a minimum the following
constructs:
(* PROGRAM HEADING *)
Program ProgramName(input, output);
begin
AnyStatement;
end.
When parsing the source file, the Pascal preprocessor ignores Pascal
statements and most Pascal compiler directives in it. Only the following
information is parsed by the Pascal preprocessor:
* The Pascal compiler directives $Skip_Text ON$, $Skip_Text OFF$,
$Set, $If, $Else, $Endif, and $Include.
* The program name. Unless you specify a module name in the
preprocessor invocation line, the preprocessor uses the program
name as the name for the module it stores. The name may
optionally have the suffix .sql to distinguish it from non-SQL
programs. A module name can contain as many as 20 bytes and must
follow the rules governing ALLBASE/SQL basic names (given in the
ALLBASE/SQL Reference Manual ).
* Constructs found after prefix EXEC SQL. These constructs follow
the rules given in the chapter, "Embedding SQL Commands," for how
and where to embed these constructs.
* Constructs found between the BEGIN DECLARE SECTION and END DECLARE
SECTION commands. These commands delimit a declare section which
contains Pascal data declarations for the host variables used in
the program. Both main and subprograms that contain SQL commands,
regardless of whether or not they contain host variables, must
include the BEGIN DECLARE SECTION and the END DECLARE SECTION
commands in order to create the modified source code file, SQLOUT.
Host variables are described in Chapter 4.
The runtime dialog for a sample program that selects and displays data is
shown in Figure 2-5. Figure 2-6 illustrates an SQLIN file of the sample
program using the following SQL commands:
INCLUDE SQLCA
BEGIN DECLARE SECTION
END DECLARE SECTION
WHENEVER
CONNECT
BEGIN WORK
SELECT
COMMIT WORK
SQLEXPLAIN
As the following interactive sample dialog illustrates, the program
begins a DBE session for PartsDBE, the sample DBEnvironment. It prompts
the user for a part number, then displays information about the part from
the table PurchDB.Parts. Warning and error conditions are handled with
WHENEVER and SQLEXPLAIN commands with the exception of explicit error
checking after the SELECT command. The program continues to prompt for a
part number until the user enters a slash (/) or a serious error is
encountered.
_______________________________________________________________________
| |
| :RUN PASEX2P |
| Program to SELECT specified rows from the Parts Table - PASEX2 |
| |
| Event List: |
| Connect to PartsDBE |
| Begin Work |
| SELECT specified row from Parts Table |
| until user enters "/" |
| Commit Work |
| Disconnect from PartsDBE |
| |
| Connect to PartsDBE |
| |
| Enter Part Number within Parts Table or "/" to STOP> 1243-P-01 |
| |
| Begin Work |
| SELECT PartNumber, PartName, SalesPrice |
| |
| Row not found! |
| Commit Work |
| |
| Enter Part Number within Parts Table or "/" to STOP> 1323-D-01 |
| |
| Begin Work |
| SELECT PartNumber, PartName, SalesPrice |
| |
| Part Number: 1323-D-01 |
| Part Name: Floppy Diskette Drive |
| Sales Price: 200.00 |
| Commit Work |
| |
| Enter Part Number within Parts Table or "/" to STOP> 1823-PT-01|
| |
| Begin Work |
| SELECT PartNumber, PartName, SalesPrice |
| |
| Part Number: 1823-PT-01 |
| Part Name: Graphics Printer |
| Sales Price: 450.00 |
| Commit Work |
| |
| Enter Part Number within Parts Table or "/" to STOP> / |
| |
| Release PartsDBE |
| |
| Terminating Program |
| |
_______________________________________________________________________
Figure 2-5. Interactive Runtime Dialog of Program PASEX2
____________________________________________________________________________
| |
| $Heap_Dispose ON$ |
| $Heap_Compact ON$ |
| Standard_Level 'HP_Pascal$ |
| (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)|
| (* This program illustrates the use of SQL's SELECT command to *)|
| (* retrieve one row or tuple at a time. *)|
| (* BEGIN WORK is executed before the SELECT and a COMMIT WORK *)|
| (* after the SELECT. An indicator variable is also used for *)|
| (* SalesPrice. *)|
| (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)|
| |
| Program pasex2(input, output); |
| |
| label |
| 1000, |
| 9999; |
| |
| const |
| OK = 0; |
| NotFound = 100; |
| DeadLock = -14024; |
| |
| var |
| |
| EXEC SQL INCLUDE SQLCA; (* SQL Communication Area *) |
| |
| (* Begin Host Variable Declarations *) |
| EXEC SQL BEGIN DECLARE SECTION; |
| PartNumber : packed array[1..16] of char; |
| PartName : packed array[1..30] of char; |
| SalesPrice : longreal; |
| SalesPriceInd : SQLIND; |
| SQLMessage : packed array[1..132] of char; |
| EXEC SQL END DECLARE SECTION; |
| (* End Host Variable Declarations *) |
| |
| Abort : boolean; |
| |
| procedure SQLStatusCheck; (* Procedure to Display Error Messages *) |
| Forward; |
| |
| (* Directive to set SQL Whenever error checking *) |
| |
| $PAGE $ |
| |
| EXEC SQL WHENEVER SQLERROR GOTO 1000; |
____________________________________________________________________________
Figure 2-6. Program PASEX2: Using Simple Select
________________________________________________________________________
| |
| procedure ConnectDBE; (* Procedure to Connect to PartsDBE *) |
| begin |
| |
| writeln('Connect to PartsDBE'); |
| EXEC SQL CONNECT TO 'PartsDBE'; |
| |
| end; (* End of ConnectDBE Procedure *) |
| |
| |
| procedure BeginTransaction; (* Procedure to Begin Work *) |
| begin |
| |
| writeln; |
| writeln('Begin Work'); |
| EXEC SQL BEGIN WORK; |
| |
| end; (* End BeginTransaction Procedure *) |
| |
| |
| procedure EndTransaction; (* Procedure to Commit Work *) |
| begin |
| |
| |
| writeln('Commit Work'); |
| EXEC SQL COMMIT WORK; |
| |
| end; (* End EndTransaction Procedure *) |
| |
| |
| (* Directive to reset SQL Whenever error checking *) |
| EXEC SQL WHENEVER SQLERROR CONTINUE; |
| |
| |
| procedure TerminateProgram; (* Procedure to Release PartsDBE *)|
| begin |
| |
| writeln('Release PartsDBE'); |
| EXEC SQL COMMIT WORK RELEASE; |
| |
| writeln; |
| writeln('Terminating Program'); |
| Goto 9999; (* Goto exit point of main program *) |
| |
| end; (* End TerminateProgram Procedure *) |
| $PAGE $ |
| |
| |
________________________________________________________________________
Figure 2-6. Program PASEX2: Using Simple Select (page 2 of 5)
__________________________________________________________________________
| |
| procedure DisplayRow; (* Procedure to Display Parts Table Rows *)|
| begin |
| writeln; |
| writeln('Part Number: ', PartNumber); |
| writeln('Part Name: ', PartName); |
| if SalesPriceInd < 0 then |
| writeln('Sales Price is NULL') |
| else |
| writeln('Sales Price: ', SalesPrice:10:2); |
| |
| end; (* End of DisplayRow *) |
| |
| $PAGE $ |
| |
| procedure SelectData; (* Procedure to Query Parts Table *) |
| begin |
| |
| repeat |
| |
| writeln; |
| prompt('Enter Part Number within Parts Table or "/" to STOP> '); |
| readln(PartNumber); |
| writeln; |
| |
| if PartNumber[1] <> '/' then |
| begin |
| |
| BeginTransaction; |
| |
| writeln('SELECT PartNumber, PartName, SalesPrice'); |
| EXEC SQL SELECT PartNumber, PartName, SalesPrice |
| INTO :PartNumber, |
| :PartName, |
| :SalesPrice :SalesPriceInd |
| FROM PurchDB.Parts |
| WHERE PartNumber = :PartNumber; |
| |
| if SQLCA.SQLWARN[0] in ['W','w'] then |
| begin |
| write('SQL WARNING has occurred. The following row'); |
| writeln('of data may not be valid.'); |
| end; |
| |
| |
| |
| |
__________________________________________________________________________
Figure 2-6. Program PASEX2: Using Simple Select (page 3 of 5)
___________________________________________________________________________
| |
| case SQLCA.SQLCODE of |
| OK : DisplayRow; |
| NotFound : begin |
| writeln; |
| writeln('Row not found!'); |
| end; |
| otherwise begin |
| SQLStatusCheck; |
| end; |
| |
| end; (* case *) |
| |
| EndTransaction; |
| |
| end; (* End if *) |
| until PartNumber[1] = '/'; |
| |
| end; (* End of SelectData Procedure *) |
| |
| procedure SQLStatusCheck; (* Procedure to Display Error Messages *)|
| begin |
| |
| Abort := FALSE; |
| if SQLCA.SQLCODE < DeadLock then Abort := TRUE; |
| |
| repeat |
| EXEC SQL SQLEXPLAIN :SQLMessage; |
| writeln(SQLMessage); |
| until SQLCA.SQLCODE = 0; |
| |
| if Abort then |
| begin |
| |
| TerminateProgram; |
| |
| end; |
| |
| end; (* End SQLStatusCheck Procedure *) |
| $PAGE $ |
| |
| |
| |
| |
| |
| |
| |
| |
___________________________________________________________________________
Figure 2-6. Program PASEX2: Using Simple Select (page 4 of 5)
__________________________________________________________
| |
| begin (* Beginning of Program *) |
| |
| write('Program to SELECT specified rows from '); |
| writeln('the Parts Table - PASEX2'); |
| writeln; |
| writeln('Event List:'); |
| writeln(' Connect to PartsDBE'); |
| writeln(' Begin Work'); |
| writeln(' SELECT specified row from Parts Table');|
| writeln(' until user enters "/" '); |
| writeln(' Commit Work'); |
| writeln(' Disconnect from PartsDBE'); |
| writeln; |
| |
| ConnectDBE; |
| SelectData; |
| TerminateProgram; |
| |
| (* Whenever Routine - Serious DBE Error *) |
| (* SQL Whenever SQLError Entry Point *) |
| 1000: |
| |
| (* Begin *) |
| SQLStatusCheck; |
| TerminateProgram; |
| (* End *) |
| |
| (* Exit Point for the main program *) |
| 9999: |
| |
| end. (* End of Program *) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
__________________________________________________________
Figure 2-6. Program PASEX2: Using Simple Select (page 5 of 5)
Output File Attributes
The Pascal preprocessor output files are temporary files. When the SQLIN
illustrated in Figure 2-6 is preprocessed, the attributes of the output
files created are as follows:
:listftemp,2
TEMPORARY FILES FOR SOMEUSER.SOMEACCT,SOMEGRP
ACCOUNT= SOMEACCT GROUP= SOMEGRP
FILENAME CODE ------------LOGICAL RECORD----------- ----SPACE----
SIZE TYP EOF LIMIT R/B SECTORS #X MX
SQLCONST 80B FA 3 2048 16 256 1 8 (TEMP)
SQLEXTN 80B FA 135 2048 16 256 26 8 (TEMP)
SQLMOD 250W FB 3 1023 1 304 10 8 (TEMP)
SQLMSG 80B FA 23 1023 16 128 1 8 (TEMP)
SQLOUT 80B FA 308 10000 16 256 32 8 (TEMP)
SQLTYPE 80B FA 61 2048 16 256 26 8 (TEMP)
SQLVAR 80B FA 7 2048 16 256 26 8 (TEMP)
:
Preprocessor Modified Source File
As the Pascal preprocessor parses the source file (SQLIN), it copies
lines from the source file and any file(s) included from it into the
modified source file (SQLOUT), comments out embedded SQL commands, and
inserts information around each embedded SQL command.
In both preprocessing modes, the Pascal preprocessor:
* Inserts a $Skip_Text ON$ and a $Skip_Text OFF$ compiler directive
around the embedded SQL command to comment out the SQL command.
* Inserts $INCLUDE Pascal compiler directives within the declaration
section. These directives reference the four preprocessor
generated include files: SQLCONST, SQLTYPE, SQLVAR, and SQLEXTN.
SQLCONST and SQLTYPE are included after the program header.
SQLVAR and SQLEXTN are included at the end of the global
declaration part of a main program.
* Keeps comments that follow an embedded command. These comments
appear after the preprocessor generated code associated with the
command. Note, for example, that the comment following the
INCLUDE SQLCA command in the source file is in the same column,
but on a different line, in the modified source file.
In full preprocessing mode, the preprocessor also:
* Generates a Pascal declaration for the SQLCA and the SQLDA in the
SQLTYPE include file.
* Generates Pascal statements providing conditional instructions
following SQL commands encountered after one of the following SQL
commands: WHENEVER SQLERROR, WHENEVER SQLWARNING, and WHENEVER
NOT FOUND.
* Generates Pascal statements that call ALLBASE/SQL external
procedures at run time. These calls reference the module stored
by the preprocessor in the DBEnvironment for execution at run
time. Parameters used by these external calls are defined in
SQLVAR, SQLCONST, and SQLTYPE.
CAUTION Although you can access SQLOUT, SQLVAR, SQLVARn, SQLTYPE,
SQLCONST, and SQLEXTN files with an editor, you should
never change the information generated by the Pascal
preprocessor. Your DBEnvironment could be damaged at run time
if preprocessor-generated constructs are altered.
If you change non-preprocessor-generated constructs in SQLOUT, make the
changes to SQLIN, re-preprocess SQLIN, and re-compile the output files
before putting the application program into production.
The following modified source file is the result of preprocessing program
pasex2 (shown previously). In the listing, the boundaries of code that
has been changed or added by the preprocessor is shaded for easy
reference.
____________________________________________________________________________
| |
| $set 'XOPEN_SQLCA=false'$ |
| $Heap_Dispose ON$ |
| $Heap_Compact ON$ |
| $Standard_Level 'HP_Pascal'$ |
| (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)|
| (* This program illustrates the use of SQL's SELECT command to *)|
| (* retrieve one row or tuple at a time. *)|
| (* BEGIN WORK is executed before the SELECT and a COMMIT WORK *)|
| (* after the SELECT. An indicator variable is also used for *)|
| (* SalesPrice. *)|
| (* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)|
| Program pasex2(input, output); |
| |
| label |
| 1000, |
| 9999; |
| |
| $include 'sqlconst'$ |
| $include 'sqltype'$ |
| const |
| OK = 0; |
| NotFound = 100; |
| DeadLock = -14024; |
| |
| var |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL INCLUDE SQLCA; |
| $SKIP_TEXT OFF$ |
| SQLCA : SQLCA_TYPE; |
| |
| |
| (* Begin Host Variable Declarations *) |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL Begin Declare Section; |
| $SKIP_TEXT OFF$ |
| |
| PartNumber : packed array[1..16] of char; |
| PartName : packed array[1..30] of char; |
| SalesPrice : longreal; |
| SalesPriceInd : SQLIND; |
| SQLMessage : packed array[1..132] of char; |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL End Declare Section; |
| $SKIP_TEXT OFF$ |
| |
____________________________________________________________________________
Figure 2-7. Modified Source File for Program PASEX2
________________________________________________________________________________
| |
| (* End Host Variable Declarations *) |
| |
| Abort : boolean; |
| |
| $include 'sqlvar'$ |
| $include 'sqlextn'$ |
| procedure SQLStatusCheck; (* Procedure to Display Error Messages *) |
| Forward; |
| |
| $PAGE $ |
| |
| (* Directive to set SQL Whenever error checking *) |
| |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL Whenever SqlError goto 1000; |
| $SKIP_TEXT OFF$ |
| |
| |
| Procedure ConnectDBE; (* Procedure to Connect to PartsDBE *) |
| begin |
| |
| writeln('Connect to PartsDBE'); |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL CONNECT TO 'PartsDBE'; |
| $SKIP_TEXT OFF$ |
| begin |
| SQLVAR1 := '00AE00005061727473444245202020202020202020202020202020202020'|
| '202020202020202020202020202020202020202020202020202020202020' |
| '202020202020202020202020202020202020202020202020202020202020' |
| '202020202020202020202020202020202020202020202020202020202020' |
| '202020202020202020202020'; |
| SQLXCON(waddress(SQLCA), SQLVAR1); |
| if SQLCA.SQLCODE < 0 then |
| goto 1000; |
| end; |
| |
| end; (* End of ConnectDBE Procedure *) |
| |
| |
| Procedure BeginTransaction; (* Procedure to Begin Work *) |
| begin |
| |
| writeln; |
| writeln('Begin Work'); |
________________________________________________________________________________
Figure 2-7. Modified Source File for Program PASEX2 (page 2 of 7)
________________________________________________________________________
| |
| $SKIP_TEXT ON$ |
| EXEC SQL BEGIN WORK; |
| $SKIP_TEXT OFF$ |
| begin |
| SQLVAR2 := '00A6007F00110061'; |
| SQLXCON(waddress(SQLCA), SQLVAR2); |
| if SQLCA.SQLCODE < 0 then |
| goto 1000; |
| end; |
| end; (* End BeginTransaction Procedure *) |
| |
| procedure EndTransaction; (* Procedure to Commit Work *) |
| begin |
| |
| writeln('Commit Work'); |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL COMMIT WORK; |
| $SKIP_TEXT OFF$ |
| begin |
| SQLVAR3 := '00A10000'; |
| SQLXCON(waddress(SQLCA), SQLVAR3); |
| if SQLCA.SQLCODE < 0 then |
| goto 1000; |
| end; |
| end; (* End EndTransaction Procedure *) |
| |
| (* Directive to reset SQL Whenever error checking *) |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL WHENEVER SQLERROR CONTINUE; |
| $SKIP_TEXT OFF$ |
| |
| procedure TerminateProgram; (* Procedure to Release PartsDBE *)|
| begin |
| |
| writeln('Release PartsDBE'); |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL COMMIT WORK RELEASE; |
| $SKIP_TEXT OFF$ |
| begin |
| begin |
| SQLVAR4 := '00A10000'; |
| SQLXCON(waddress(SQLCA), SQLVAR4); |
| end; |
________________________________________________________________________
Figure 2-7. Modified Source File for Program PASEX2 (page 3 of 7)
_____________________________________________________________________________
| |
| begin |
| SQLVAR5 := '00B200002020202020202020202020202020202020202020FFFFFFFF';|
| SQLXCON(waddress(SQLCA), SQLVAR5); |
| end; |
| end; |
| |
| |
| writeln; |
| writeln('Terminating Program'); |
| Goto 9999; (* Goto exit point of main program *) |
| |
| end; (* End TerminateProgram Procedure *) |
| $PAGE $ |
| |
| |
| procedure DisplayRow; (* Procedure to Display Parts Table Rows *) |
| begin |
| |
| writeln; |
| writeln('Part Number: ', PartNumber); |
| writeln('Part Name: ', PartName); |
| if SalesPriceInd < 0 then |
| writeln('Sales Price is NULL') |
| else |
| writeln('Sales Price: ', SalesPrice:10:2); |
| |
| end; (* End of DisplayRow *) |
| $PAGE $ |
| |
| procedure SelectData; (* Procedure to Query Parts Table *) |
| begin |
| |
| repeat |
| |
| writeln; |
| prompt('Enter Part Number within Parts Table or "/" to STOP> '); |
| readln(PartNumber); |
| writeln; |
| |
| if PartNumber[1] |
| '/' then |
| begin |
| |
| BeginTransaction; |
| |
| writeln('SELECT PartNumber, PartName, SalesPrice'); |
| |
_____________________________________________________________________________
Figure 2-7. Modified Source File for Program PASEX2 (page 4 of 7)
________________________________________________________________________
| |
| $SKIP_TEXT ON$ |
| EXEC SQL SELECT PartNumber, PartName, SalesPrice |
| INTO :PartNumber, |
| :PartName, |
| :SalesPrice :SalesPriceInd |
| FROM PurchDB.Parts |
| WHERE PartNumber = :PartNumber; |
| $SKIP_TEXT OFF$ |
| begin |
| SQLTEMPV.REC1.PartNumber1 := PartNumber; |
| SQLXFET(waddress(SQLCA),SQLOWNER,SQLMODNAME,1,waddress(SQLTEMPV),|
| 16,64,TRUE); |
| if SQLCA.SQLCODE = 0 then |
| begin |
| PartNumber := SQLTEMPV.REC2.PartNumber1; |
| PartName := SQLTEMPV.REC2.PartName2; |
| if SQLTEMPV.REC2.SalesPriceInd4 >= 0 then |
| SalesPrice := SQLTEMPV.REC2.SalesPrice3; |
| SalesPriceInd := SQLTEMPV.REC2.SalesPriceInd4; |
| end |
| else |
| begin |
| end; |
| end; |
| |
| if SQLCA.SQLWARN[0] in ['W','w'] then |
| begin |
| write('SQL WARNING has occurred. The following row'); |
| writeln('of data may not be valid.'); |
| end; |
| |
| case SQLCA.SQLCODE of |
| OK : DisplayRow; |
| NotFound : begin |
| writeln; |
| writeln('Row not found!'); |
| end; |
| otherwise begin |
| SQLStatusCheck; |
| end; |
| |
| end; (* case *) |
| |
| EndTransaction; |
| |
| end; (* End if *) |
| until PartNumber[1] = '/'; |
| end; (* End of SelectData Procedure *) |
________________________________________________________________________
Figure 2-7. Modified Source File for Program PASEX2 (page 5 of 7)
___________________________________________________________________________
| |
| procedure SQLStatusCheck; (* Procedure to Display Error Messages *)|
| begin |
| |
| Abort := FALSE; |
| if SQLCA.SQLCODE < DeadLock then Abort := TRUE; |
| |
| repeat |
| |
| $SKIP_TEXT ON$ |
| EXEC SQL SQLEXPLAIN :SQLMessage; |
| $SKIP_TEXT OFF$ |
| begin |
| SQLXPLN(waddress(SQLCA),waddress(SQLTEMPV.REC4),132,0); |
| SQLMessage := ''; |
| strmove(132,SQLTEMPV.REC4,1,SQLMessage, 1); |
| end; |
| |
| writeln(SQLMessage); |
| until SQLCA.SQLCODE = 0; |
| |
| if Abort then |
| begin |
| TerminateProgram; |
| end; |
| |
| end; (* End SQLStatusCheck Procedure *) |
| $PAGE $ |
| |
| begin (* Beginning of Program *) |
| |
| write('Program to SELECT specified rows from '); |
| writeln('the Parts Table - PASEX2'); |
| writeln; |
| writeln('Event List:'); |
| writeln(' Connect to PartsDBE'); |
| writeln(' Begin Work'); |
| writeln(' SELECT specified row from Parts Table'); |
| writeln(' until user enters "/" '); |
| writeln(' Commit Work'); |
| writeln(' Disconnect from PartsDBE'); |
| writeln; |
| |
| ConnectDBE; |
| SelectData; |
| TerminateProgram; |
| |
| (* Whenever Routine - Serious DBE Error *) |
| (* SQL Whenever SQLError Entry Point *) |
___________________________________________________________________________
Figure 2-7. Modified Source File for Program PASEX2 (page 6 of 7)
____________________________________________
| |
| 1000: |
| |
| (* Begin *) |
| SQLStatusCheck; |
| TerminateProgram; |
| (* End *) |
| |
| (* Exit Point for the main program *)|
| 9999: |
| |
| end. (* End of Program *) |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
____________________________________________
Figure 2-7. Modified Source File for Program PASEX2 (page 7 of 7)