|
ALLBASE/SQL FORTRAN Application Programming Guide: HP 9000 Computer Systems > Chapter 7 Simple Data ManipulationProgram Using SELECT, UPDATE, DELETE, and INSERT |
|
The flow chart shown in Figure 7-1 summarizes the functionality of program forex7, which uses the four simple data manipulation commands to operate on the PurchDB.Vendors table. Forex7 uses a function menu to determine whether to execute one or more SELECT, UPDATE, DELETE, or INSERT operations. Each execution of a simple data manipulation command is done in a separate transaction. The runtime dialog for program forex7 appears in Figure 7-2, and the source code in Figure 7-3. The main program 1 first calls function ConnectDBE 3 to start a DBE session. This function executes the CONNECT command for the sample DBEnvironment, PartsDBE. The main program then displays a menu of selections. The next operation performed depends on the number entered in response to this menu:
Function Select 10 prompts for a vendor number or a zero. If a zero is entered, the function menu is re-displayed. If a vendor number is entered, subroutine BeginTransaction 5 is executed to issue the BEGIN WORK command. Then a SELECT command is executed to retrieve all data for the vendor specified from PurchDB.Vendors. The SQLCA.SQLCODE returned is examined to determine the next action:
Function Update 12 lets the user UPDATE the value of a column only if it contains a null value. The function prompts for a vendor number or a zero. If a zero is entered, the function menu is re-displayed. If a vendor number is entered, subroutine BeginTransaction 5 is executed. Then a SELECT command is executed to retrieve data from PurchDB.Vendors for the vendor specified. The SQLCA.SQLCODE returned is examined to determine the next action:
Function Delete 14 lets the user DELETE one row. The function prompts for a vendor number or a zero. If a zero is entered, the function menu is re-displayed. If a vendor number is entered, subroutine BeginTransaction 5 is executed. Then a SELECT command is executed to retrieve all data for the vendor specified from PurchDB.Vendors. The SQLCA.SQLCODE returned is examined to determine the next action:
Function Insert 15 lets the user INSERT one row. The subroutine prompts for a vendor number or a zero. If a zero is entered, the function menu is re-displayed. If a vendor number is entered, the user is prompted for values for each column. The user can enter a zero to specify a null value for potentially null columns; to assign a null value, the program assigns a -1 to the appropriate null indicator. Subroutine BeginTransaction is executed to start a transaction, then an INSERT command is used to insert a row containing the specified values. If the INSERT operation results in an error condition, subroutine SQLStatusCheck 2 is executed, and then subroutine RollBackWork 7 is executed to issue the ROLLBACK WORK command. If the INSERT operation is successful, subroutine CommitWork 6 terminates the transaction by executing the COMMIT WORK command. The user is then re-prompted for a vendor number or a zero. When the user enters a zero in response to the function menu display, the program terminates by executing subroutine TerminateProgram 4. This subroutine executes the RELEASE command. Figure 7-1 Flow Chart of Program forex7
Figure 7-2 Flow Chart of Program forex7 (page 2 of 2)
Figure 7-3 Runtime Dialog of Program forex7 Program for Simple Data Manipulation of the Vendors Table -- forex7 Event List: CONNECT TO PartsDBE Prompt for type of transaction Prompt for VendorNumber BEGIN WORK Display row Perform specified function COMMIT WORK or ROLLBACK WORK Repeat the above five steps until user enters 0 Repeat the above seven steps until user enters 0 RELEASE ../sampledb/PartsDBE CONNECT TO ../sampledb/PartsDBE 1....SELECT rows from PurchDB.Vendors table 2....UPDATE rows with null values in PurchDB.Vendors table 3....DELETE rows from PurchDB.Vendors table 4....INSERT rows into PurchDB.Vendors table Enter your choice or a 0 to STOP > 4 Enter Vendor Number to INSERT or a 0 to STOP > 9016 Enter Vendor Name > Wolfe Works Enter new ContactName (0 for NULL) > Stanley Wolfe Enter new PhoneNumber (0 for NULL) > 408 975 6061 Enter new Vendor Street > 7614 Canine Way Enter new Vendor City > San Jose Enter new Vendor State > CA Enter new Vendor Zip Code > 90016 Enter new VendorRemarks (0 for NULL) > 0 BEGIN WORK INSERT new row into PurchDB.Vendors COMMIT WORK Enter Vendor Number to INSERT or a 0 to STOP > 0 1....SELECT rows from PurchDB.Vendors table 2....UPDATE rows with null values in PurchDB.Vendors table 3....DELETE rows from PurchDB.Vendors table 4....INSERT rows into PurchDB.Vendors table Enter your choice or a 0 to STOP > 1 Enter Vendor Number to SELECT or a 0 to STOP > 9016 BEGIN WORK SELECT * from PurchDB.Vendors VendorNumber: 9016 VendorName: Wolfe Works ContactName: Stanley Wolfe PhoneNumber: 408 975 6061 VendorStreet: 7614 Canine Way VendorCity: San Jose VendorState: CA VendorZipCode:90016 VendorRemarks is NULL COMMIT WORK Enter Vendor Number to SELECT or a 0 to STOP > 0 1....SELECT rows from PurchDB.Vendors table 2....UPDATE rows with null values in PurchDB.Vendors table 3....DELETE rows from PurchDB.Vendors table 4....INSERT rows into PurchDB.Vendors table Enter your choice or a 0 to STOP > 2 Enter Vendor Number to UPDATE or a 0 to STOP > 9016 BEGIN WORK SELECT * from PurchDB.Vendors VendorNumber: 9016 VendorName: Wolfe Works ContactName: Stanley Wolfe PhoneNumber: 408 975 6061 VendorStreet: 7614 Canine Way VendorCity: San Jose VendorState: CA VendorZipCode:90016 VendorRemarks is NULL Enter new VendorRemarks (0 for NULL) > can expedite shipments UPDATE the PurchDB.Vendors table COMMIT WORK Enter Vendor Number to UPDATE or a 0 to STOP > 0 1....SELECT rows from PurchDB.Vendors table 2....UPDATE rows with null values in PurchDB.Vendors table 3....DELETE rows from PurchDB.Vendors table 4....INSERT rows into PurchDB.Vendors table Enter your choice or a 0 to STOP > 3 Enter Vendor Number to DELETE or a 0 to STOP > 9016 BEGIN WORK SELECT * from PurchDB.Vendors VendorNumber: 9016 VendorName: Wolfe Works ContactName: Stanley Wolfe PhoneNumber: 408 975 6061 VendorStreet: 7614 Canine Way VendorCity: San Jose VendorState: CA VendorZipCode:90016 VendorRemarks:can expedite shipments Is it OK to DELETE this row (N/Y)? > Y DELETE row from PurchDB.Vendors! COMMIT WORK Enter Vendor Number to DELETE or a 0 to STOP > 0 1....SELECT rows from PurchDB.Vendors table 2....UPDATE rows with null values in PurchDB.Vendors table 3....DELETE rows from PurchDB.Vendors table 4....INSERT rows into PurchDB.Vendors table Enter your choice or a 0 to STOP > 0 RELEASE ../sampledb/PartsDBE $ Figure 7-4 Program forex7: Using INSERT, UPDATE, SELECT, and DELETE
PROGRAM forex7
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
C * This program illustrates simple data manipulation. It*
C * uses the UPDATE command with indicator variables to *
C * update any row in the Vendors table that contains null*
C * values. It also uses indicator variables in *
C * conjunction with SELECT and INSERT. The DELETE *
C * command is also illustrated. *
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
IMPLICIT NONE
LOGICAL*2 Done, ConnectDBE, Select, Update, Delete
LOGICAL*2 Insert
CHARACTER Response
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Beginning of the Main Program *) 1
WRITE (*,*) CHAR(27),'U'
WRITE (*,*) 'Program for Simple Data Manipulation of Vendors
1 - table forex7'
WRITE (*,*) ' '
WRITE (*,*) 'Event List:'
WRITE (*,*) ' CONNECT TO PartsDBE'
WRITE (*,*) ' Prompt for type of transaction'
WRITE (*,*) ' Prompt for VendorNumber'
WRITE (*,*) ' BEGIN WORK'
WRITE (*,*) ' Display row'
WRITE (*,*) ' Perform specified function'
WRITE (*,*) ' COMMIT WORK or ROLLBACK WORK'
WRITE (*,*) ' Repeat the above five steps until user enters 0'
WRITE (*,*) ' Repeat the above seven steps until user enters 0'
WRITE (*,*) ' RELEASE PartsDBE'
WRITE (*,*) ' '
IF (ConnectDBE()) THEN
Done = .FALSE.
DO WHILE (.NOT.Done)
WRITE (*,*) ' '
WRITE (*,*) '1....SELECT rows from PurchDB.Vendors table'
WRITE (*,*) '2....UPDATE rows with null values in PurchDB.Vend
1ors table'
WRITE (*,*) '3....DELETE rows from PurchDB.Vendors table'
WRITE (*,*) '4....INSERT rows into PurchDB.Vendors table'
WRITE (*,*) ' '
WRITE (*,100)
100 FORMAT($, ' Enter your choice or a 0 to STOP > ')
READ (*,110) Response
110 FORMAT(A1)
IF (Response .EQ. '0') THEN
Done = .TRUE.
ELSEIF (Response .EQ. '1') THEN
Done = Select()
ELSEIF (Response .EQ. '2') THEN
Done = Update()
ELSEIF (Response .EQ. '3') THEN
Done = Delete()
ELSEIF (Response .EQ. '4') THEN
Done = Insert()
ELSE
WRITE (*,*) ' Enter 0-4 only please!'
WRITE (*,*) ' '
ENDIF
END DO
CALL TerminateProgram
ELSE
WRITE (*,*) 'Cannot Connect to your DBEnvironment!'
ENDIF
STOP
END
C (* End of Main Program *)
C (* Beginning of the Sub-Routines *)
SUBROUTINE SQLStatusCheck 2
C**** SUBROUTINE SQLStatusCheck checks status of SQL commands
C**** and print HPSQL error messages.
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
LOGICAL*2 Abort, Check
INTEGER DeadLock
PARAMETER (DeadLock = -14024)
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
Abort = .FALSE.
IF (SQLCode .LT. DeadLock) THEN
Abort = .TRUE.
WRITE (*,*) 'A serious error has occured!'
ENDIF
Check = .TRUE.
DO WHILE (Check)
EXEC SQL SQLEXPLAIN :SQLMessage
WRITE(*, 100) SQLMessage
100 FORMAT(A120)
IF (SQLCode .EQ. 0) THEN
Check = .FALSE.
ENDIF
END DO
IF (Abort) THEN
CALL TerminateProgram
STOP 'Program Aborted'
END IF
RETURN
END
C (* End of Subroutine SQLStatusCheck *)
LOGICAL*2 FUNCTION ConnectDBE() 3
C**** FUNCTION to connect to ../sampledb/PartsDBE
INTEGER*2 OK
PARAMETER (OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
EXEC SQL END DECLARE SECTION
WRITE (*,*) 'CONNECT TO ../sampledb/PartsDBE'
EXEC SQL CONNECT TO '../sampledb/PartsDBE'
ConnectDBE = .TRUE.
IF (SQLCode .NE. OK) THEN
ConnectDBE = .FALSE.
CALL SQLStatusCheck
ENDIF
RETURN
END
C (* End of Function ConnectDBE *)
SUBROUTINE TerminateProgram 4
C**** SUBROUTINE to release from ../sampledb/PartsDBE
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
EXEC SQL END DECLARE SECTION
WRITE(*,*) ' '
WRITE(*,*) 'RELEASE ../sampledb/PartsDBE'
EXEC SQL RELEASE
RETURN
END
C (* End of Subroutine TerminateProgram *)
SUBROUTINE BeginTransaction 5
C**** SUBROUTINE to begin work
INTEGER*2 OK
PARAMETER (OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
EXEC SQL END DECLARE SECTION
WRITE (*,*) ' '
WRITE (*,*) 'BEGIN WORK'
EXEC SQL BEGIN WORK
IF (SQLCode .NE. OK) THEN
CALL SQLStatusCheck
CALL TerminateProgram
ENDIF
RETURN
END
C (* End of Subroutine BeginTransaction *)
SUBROUTINE CommitWork 6
C**** SUBROUTINE to commit work
INTEGER*2 OK
PARAMETER (OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
EXEC SQL END DECLARE SECTION
WRITE(*,*) 'COMMIT WORK'
EXEC SQL COMMIT WORK
IF (SQLCode .NE. OK) THEN
CALL SQLStatusCheck
CALL TerminateProgram
ENDIF
RETURN
END
C (* End of Subroutine CommitWork *)
SUBROUTINE RollBackWork 7
C**** SUBROUTINE to RollBack Work
INTEGER*2 OK
PARAMETER (OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
EXEC SQL BEGIN DECLARE SECTION
EXEC SQL END DECLARE SECTION
WRITE(*,*) 'ROLLBACK WORK'
EXEC SQL ROLLBACK WORK
IF (SQLCode .NE. OK) THEN
CALL SQLStatusCheck
CALL TerminateProgram
ENDIF
RETURN
END
C (* End of Subroutine RollBackWork *)
LOGICAL*2 FUNCTION AnyNulls(ContactNameInd,
1 PhoneNumberInd, VendorRemarksInd)
C****FUNCTION to test rows for NULL values 8
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
SQLIND ContactNameInd, PhoneNumberInd, VendorRemarksInd
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
IF ((ContactNameInd .EQ. 0) .AND.
1 (PhoneNumberInd .EQ. 0) .AND.
2 (VendorRemarksInd .EQ. 0)) THEN
C (All columns that might be null contain non-null values)
WRITE (*,*) 'No null values exist for this vendor.'
WRITE (*,*) ' '
AnyNulls = .FALSE.
ELSE
AnyNulls = .TRUE.
ENDIF
RETURN
END
C (* End of Function AnyNulls *)
SUBROUTINE DisplayRow (VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
C**** SUBROUTINE to display Vendors table rows 9
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
WRITE(*,*) ' '
WRITE(*, '('' VendorNumber: '',I10)') VendorNumber
WRITE(*, '('' VendorName: '',A30)') VendorName
IF (ContactNameInd .LT. 0) THEN
WRITE(*,*) ' ContactName is NULL'
ELSE
WRITE(*, '('' ContactName: '',A30)') ContactName
ENDIF
IF (PhoneNumberInd .LT. 0) THEN
WRITE(*,*) ' PhoneNumber is NULL'
ELSE
WRITE(*, '('' PhoneNumber: '',A16)') PhoneNumber
ENDIF
WRITE(*, '('' VendorStreet: '',A30)') VendorStreet
WRITE(*, '('' VendorCity: '',A20)') VendorCity
WRITE(*, '('' VendorState: '',A2)') VendorState
WRITE(*, '('' VendorZipCode:'',A10)') VendorZipCode
IF (VendorRemarksInd .LT. 0) THEN
WRITE(*,*) ' VendorRemarks is NULL'
ELSE
WRITE(*, '('' VendorRemarks:'',A50)') VendorRemarks
ENDIF
WRITE(*,*) ' '
RETURN
END
C (* End of Subroutine DisplayRow *)
LOGICAL*2 FUNCTION Select() 10
C**** FUNCTION to select rows from PurchDB.Vendors table.
INTEGER NotFound,MultipleRows,OK
LOGICAL*2 AnyNulls
PARAMETER (NotFound = 100,
1 MultipleRows = -10002,
2 OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
Select = .FALSE.
VendorNumber = 1
DO WHILE (VendorNumber .NE. 0)
WRITE (*,*) ' '
WRITE (*,100)
100 FORMAT($, ' Enter Vendor Number to SELECT or a 0 to STOP > ')
READ (*,110) VendorNumber
110 FORMAT(I4)
IF (VendorNumber .NE. 0) THEN
CALL BeginTransaction
WRITE (*,*) ' '
WRITE (*,*) 'SELECT * from PurchDB.Vendors'
EXEC SQL SELECT VendorNumber,
1 VendorName,
2 ContactName,
3 PhoneNumber,
4 VendorStreet,
5 VendorCity,
6 VendorState,
7 VendorZipCode,
8 VendorRemarks
9 INTO :VendorNumber,
1 :VendorName,
2 :ContactName :ContactNameInd,
3 :PhoneNumber :PhoneNumberInd,
4 :VendorStreet,
5 :VendorCity,
6 :VendorState,
7 :VendorZipCode,
8 :VendorRemarks :VendorRemarksInd
9 FROM PurchDB.Vendors
1 WHERE VendorNumber = :VendorNumber
IF (SQLCode .EQ. OK) THEN
CALL DisplayRow(VendorNumber,VendorName,ContactName,
1 PhoneNumber,VendorStreet,VendorCity,
2 VendorState,VendorZipCode,VendorRemarks,
3 ContactNameInd,PhoneNumberInd,VendorRemarksInd)
ELSEIF (SQLCode .EQ. NotFound) THEN
WRITE (*,*) ' '
WRITE (*,*) 'Row not found!'
ELSEIF (SQLCode .EQ. MultipleRows) THEN
WRITE (*,*) ' '
WRITE (*,*) 'WARNING: More than one row qualifies!'
ELSE
CALL SQLStatusCheck
ENDIF
CALL CommitWork
ENDIF
END DO
RETURN
END
C (* End of Function Select *)
SUBROUTINE DisplayUpdate(VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
C**** SUBROUTINE to display and update 11
C**** a row from the PurchDB.Vendors table
INTEGER NotFound,MultipleRows,OK
LOGICAL*2 AnyNulls
PARAMETER (NotFound = 100,
1 MultipleRows = -10002,
2 OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
CALL DisplayRow(VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
IF (AnyNulls(ContactNameInd, PhoneNumberInd,
1 VendorRemarksInd)) THEN
IF (ContactNameInd .LT. 0) THEN
WRITE(*,*)
WRITE(*,100)
100 FORMAT($, ' Enter new ContactName (0 for NULL) > ')
READ(*,110) ContactName
110 FORMAT (A30)
ENDIF
IF (PhoneNumberInd .LT. 0) THEN
WRITE (*,*) ' '
WRITE(*,120)
120 FORMAT($, ' Enter new PhoneNumber (0 for NULL) > ')
READ(*,130) PhoneNumber
130 FORMAT(A16)
ENDIF
IF (VendorRemarksInd .LT. 0) THEN
WRITE(*,*)
WRITE(*,140)
140 FORMAT($, ' Enter new VendorRemarks (0 for NULL) > ')
READ(*,150) VendorRemarks
150 FORMAT(A50)
ENDIF
IF (ContactName .EQ. '0') THEN
ContactNameInd = -1
ELSE
ContactNameInd = 0
ENDIF
IF (PhoneNumber .EQ. '0') THEN
PhoneNumberInd = -1
ELSE
PhoneNumberInd = 0
ENDIF
IF (VendorRemarks .EQ. '0') THEN
VendorRemarksInd = -1
ELSE
VendorRemarksInd = 0
ENDIF
WRITE (*,*) 'UPDATE the PurchDB.Vendors table'
EXEC SQL UPDATE PurchDB.Vendors
1 SET ContactName = :ContactName :ContactNameInd,
2 PhoneNumber = :PhoneNumber :PhoneNumberInd,
3 VendorRemarks = :VendorRemarks :VendorRemarksInd
4 WHERE VendorNumber = :VendorNumber
IF (SQLCode .NE. OK) THEN
CALL SQLStatusCheck
ENDIF
ENDIF
RETURN
END
C (End of Subroutine DisplayUpdate)
LOGICAL*2 FUNCTION Update() 12
C**** FUNCTION to update rows from PurchDB.Vendors table.
INTEGER NotFound,MultipleRows,OK
LOGICAL*2 AnyNulls
PARAMETER (NotFound = 100,
1 MultipleRows = -10002,
2 OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
Update = .FALSE.
VendorNumber = 1
DO WHILE (VendorNumber .NE. 0)
WRITE (*,*) ' '
WRITE (*,100)
100 FORMAT($, ' Enter Vendor Number to UPDATE or a 0 to STOP > ')
READ (*,110) VendorNumber
110 FORMAT(I4)
IF (VendorNumber .NE. 0) THEN
CALL BeginTransaction
WRITE (*,*) ' '
WRITE (*,*) 'SELECT * from PurchDB.Vendors'
EXEC SQL SELECT VendorNumber,
1 VendorName,
2 ContactName,
3 PhoneNumber,
4 VendorStreet,
5 VendorCity,
6 VendorState,
7 VendorZipCode,
8 VendorRemarks
9 INTO :VendorNumber,
1 :VendorName,
2 :ContactName :ContactNameInd,
3 :PhoneNumber :PhoneNumberInd,
4 :VendorStreet,
5 :VendorCity,
6 :VendorState,
7 :VendorZipCode,
8 :VendorRemarks :VendorRemarksInd
9 FROM PurchDB.Vendors
1 WHERE VendorNumber = :VendorNumber
IF (SQLCode .EQ. OK) THEN
CALL DisplayUpdate (VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
ELSEIF (SQLCode .EQ. NotFound) THEN
WRITE (*,*) ' '
WRITE (*,*) 'Row not found!'
ELSEIF (SQLCode .EQ. MultipleRows) THEN
WRITE(*,*) ' '
WRITE (*,*) 'WARNING: More than one row qualifies!'
CALL SQLStatusCheck
ENDIF
CALL CommitWork
ENDIF
END DO
RETURN
END
C (* End of Function Update *)
C**** SUBROUTINE to Display and Delete a row 13
C**** from the PurchDB.Vendors table
SUBROUTINE DisplayDelete(VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
CHARACTER Response
INTEGER NotFound,MultipleRows,OK
LOGICAL*2 AnyNulls
PARAMETER (NotFound = 100,
1 MultipleRows = -10002,
2 OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
CALL DisplayRow(VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
WRITE (*,100)
100 FORMAT($, ' Is it OK to DELETE this row (N/Y)? >')
READ (*, 110) Response
110 FORMAT(A1)
IF ((Response .EQ. 'Y') .OR. (Response .EQ. 'y')) THEN
WRITE (*,*) ' '
WRITE (*,*) 'DELETE row from PurchDB.Vendors!'
EXEC SQL DELETE FROM PurchDB.Vendors
1 WHERE VendorNumber = :VendorNumber
IF (SQLCode .NE. OK) THEN
CALL SQLStatusCheck
ENDIF
ELSE
WRITE (*,*) ' '
WRITE (*,*) 'Row not deleted from PurchDB.Vendors!'
ENDIF
RETURN
END
C**** (End of Subroutine DisplayDelete)
LOGICAL*2 FUNCTION Delete() 14
C**** FUNCTION to delete rows from PurchDB.Vendors table.
INTEGER NotFound,MultipleRows,OK
LOGICAL*2 AnyNulls
PARAMETER (NotFound = 100,
1 MultipleRows = -10002,
2 OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
Delete = .FALSE.
VendorNumber = 1
DO WHILE (VendorNumber .NE. 0)
WRITE (*,*) ' '
WRITE (*,100)
100 FORMAT($, ' Enter Vendor Number to DELETE or a 0 to STOP > ')
READ (*,110) VendorNumber
110 FORMAT(I4)
IF (VendorNumber .NE. 0) THEN
CALL BeginTransaction
WRITE (*,*) ' '
WRITE (*,*) 'SELECT * from PurchDB.Vendors'
EXEC SQL SELECT VendorNumber,
1 VendorName,
2 ContactName,
3 PhoneNumber,
4 VendorStreet,
5 VendorCity,
6 VendorState,
7 VendorZipCode,
8 VendorRemarks
9 INTO :VendorNumber,
1 :VendorName,
2 :ContactName :ContactNameInd,
3 :PhoneNumber :PhoneNumberInd,
4 :VendorStreet,
5 :VendorCity,
6 :VendorState,
7 :VendorZipCode,
8 :VendorRemarks :VendorRemarksInd
9 FROM PurchDB.Vendors
1 WHERE VendorNumber = :VendorNumber
IF (SQLCode .EQ. OK) THEN
CALL DisplayDelete (VendorNumber, VendorName, ContactName,
1 PhoneNumber, VendorStreet, VendorCity,
2 VendorState, VendorZipCode, VendorRemarks,
3 ContactNameInd, PhoneNumberInd, VendorRemarksInd)
ELSEIF (SQLCode .EQ. NotFound) THEN
WRITE (*,*) ' '
WRITE (*,*) 'Row not found!'
ELSEIF (SQLCode .EQ. MultipleRows) THEN
WRITE (*,*) ' '
WRITE (*,*) 'WARNING: More than one row qualifies!'
ELSE
CALL SQLStatusCheck
ENDIF
CALL CommitWork
ENDIF
END DO
RETURN
END
C** (End of Function Delete)
LOGICAL*2 FUNCTION Insert() 15
C** FUNCTION to insert a row into the Vendors table
INTEGER NotFound,MultipleRows,OK
LOGICAL*2 AnyNulls
PARAMETER (NotFound = 100,
1 MultipleRows = -10002,
2 OK = 0)
C (* Begin SQL Communication Area *)
EXEC SQL INCLUDE SQLCA
C (* Begin Host Variable Declarations *)
EXEC SQL BEGIN DECLARE SECTION
INTEGER*4 VendorNumber
CHARACTER*30 VendorName
CHARACTER*30 ContactName
SQLIND ContactNameInd
CHARACTER*16 PhoneNumber
SQLIND PhoneNumberInd
CHARACTER*30 VendorStreet
CHARACTER*20 VendorCity
CHARACTER*2 VendorState
CHARACTER*10 VendorZipCode
CHARACTER*50 VendorRemarks
SQLIND VendorRemarksInd
CHARACTER*120 SQLMessage
EXEC SQL END DECLARE SECTION
C (* End Host Variable Declarations *)
Insert = .FALSE.
VendorNumber = 1
DO WHILE (VendorNumber .NE. 0)
WRITE (*,*) ' '
WRITE (*,100)
100 FORMAT($, ' Enter Vendor Number to INSERT or a 0 to STOP > ')
READ (*,110) VendorNumber
110 FORMAT(I4)
IF (VendorNumber .NE. 0) THEN
WRITE (*,*) ' '
WRITE (*,120)
120 FORMAT($,' Enter Vendor Name > ')
READ (*,130) VendorName
130 FORMAT(A30)
WRITE(*,*)
WRITE (*,140)
140 FORMAT($,' Enter new ContactName (0 for NULL) > ')
READ(*,150) ContactName
150 FORMAT (A30)
IF (ContactName .EQ. '0') THEN
ContactNameInd = -1
ELSE
ContactNameInd = 0
ENDIF
WRITE (*,*)
WRITE (*,160)
160 FORMAT($,' Enter new PhoneNumber (0 for NULL) > ')
READ(*,170) PhoneNumber
170 FORMAT(A16)
IF (PhoneNumber .EQ. '0') THEN
PhoneNumberInd = -1
ELSE
PhoneNumberInd = 0
ENDIF
WRITE(*,*)
WRITE (*,180)
180 FORMAT($,' Enter new Vendor Street > ')
READ(*,190) VendorStreet
190 FORMAT(A30)
WRITE(*,*)
WRITE (*,200)
200 FORMAT($,' Enter new Vendor City > ')
READ(*,210) VendorCity
210 FORMAT(A20)
WRITE(*,*)
WRITE (*,220)
220 FORMAT($,' Enter new Vendor State > ')
READ(*,230) VendorState
230 FORMAT(A2)
WRITE(*,*)
WRITE (*,240)
240 FORMAT($,' Enter new Vendor Zip Code > ')
READ(*,250) VendorZipCode
250 FORMAT(A10)
WRITE(*,*)
WRITE (*,260)
260 FORMAT($,' Enter new VendorRemarks (0 for NULL > ')
READ(*,270) VendorRemarks
270 FORMAT(A50)
IF (VendorRemarks .EQ. '0') THEN
VendorRemarksInd = -1
ELSE
VendorRemarksInd = 0
ENDIF
CALL BeginTransaction
WRITE (*,*)'INSERT new row into PurchDB.Vendors'
EXEC SQL INSERT
1 INTO PurchDB.Vendors
2 (VendorNumber, VendorName, ContactName,
3 PhoneNumber, VendorStreet, VendorCity,
4 VendorState, VendorZipCode, VendorRemarks)
5 VALUES (:VendorNumber,
6 :VendorName,
6 :ContactName :ContactNameInd,
7 :PhoneNumber :PhoneNumberInd,
8 :VendorStreet,
9 :VendorCity,
1 :VendorState,
2 :VendorZipCode,
3 :VendorRemarks :VendorRemarksInd)
IF (SQLCode .NE. OK) THEN
CALL SQLStatusCheck
CALL RollBackWork
ELSE
CALL CommitWork
ENDIF
ENDIF
END DO
RETURN
END
C (* End of Function Insert *)
|
||||||||||||||||||||||||||||