A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.
-
Upload
ashley-robbins -
Category
Documents
-
view
234 -
download
0
Transcript of A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.
1
A Guide to SQL, Fifth Edition
Chapter 8Embedded SQL
2
Objectives
Embed SQL commands in COBOL statements Retrieve single rows using embedded SQLUpdate a table using embedded INSERT, UPDATE, and DELETE commandsUse cursors to retrieve multiple rows in embedded SQLUpdate a database using cursorsLearn how to handle errors in programs containing embedded SQL commands
3
Introduction
Use a procedural language to use embedded SQL commands to accomplish tasks beyond the capabilities of SQL
Use EXEC SQL and END-SQL in COBOL programming to distinguish embedded SQL commands from standard COBOL statements
4
Introduction
DATA DIVISION (WORKING-STORAGE SECTION) contains statements declaring the tables that will be used in processing the database
Communications area includes items that allow SQL to communicate various aspects of processing to the program
5
Introduction
SQLCODE contains a code indicating the fate of the executed statementNormal = zeroNot normal = value in SQLCODE that
indicates problem
PROCEDURE DIVISION contain new statements that will be SQL statements with slight variations
6
DATA DIVISION
Tables to be processed are declared in WORKING-STORAGE
Use the DECLARE TABLE command
7
Create SALES_REP Table
EXEC SQLDECLARE SALES_REP TABLE
(SLSREP_NUMBER DECIMAL (2), LAST CHAR (10), FIRST CHAR (8), STREET CHAR (15), CITY CHAR (15), STATE CHAR (2), ZIP_CODE CHAR (5), TOTAL_COMMISSION DECIMAL (7,2), COMMISSION_RATE DECIMAL (3,2) )
END-EXEC.
8
Code for Using Library
EXEC SQL
INCLUDE DECSALES_REP
END-EXEC.
9
COBOL Variables
01 W-SALES-REP.
03 W-SLSREP_NUMBER PIC S9(2) COMP-3.
03 W-LAST PIC X(10).
03 W-FIRST PIC X(8).
03 W-STREET PIC X(15).
03 W-CITY PIC X(15).
03 W-STATE PIC X(2).
03 W-ZIP-CODE PIC X(5).
03 W-TOTAL-COMMISSION PIC S9(5)V9(2) COMP-3.
03 W-COMMISSION-RATE PIC S9V9(2)COMP-3.
10
SQLCA
SQL communication area provides feedback to the program
Example:EXEC SQL
INCLUDE SQLCA
END-EXEC.
11
PROCEDURE DIVISION
Use Host variables
Proceed the variable with a colon
Replace results of SQL queries in host variables in the INTO CLAUSESELECT LAST
INTO :W-LAST
FROM SALES_REP
WHERE SLSREP_NUMBER = “03”
Make provisions for exceptional conditions
12
Example 1
Obtain the last name of sales rep number 03 and place it in W-LAST
13
Retrieve a Single Row and Column
In SQL:SELECT LAST
FROM SALES_REPWHERE SLSREP_NUMBER = “03”;
In COBOL:EXEC SQL
SELECT LASTINTO :W-LASTFROM SALES_REPWHERE SLSREP_NUMBER = “03”
END-EXEC.
14
Example 2
Obtain all information about the sales rep whose number is stored in the host variable W-SLSREP-NUMBER
15
Retrieve a Single Row and All Columns
EXEC SQL
SELECT LAST, FIRST, STREET, CITY, STATE, ZIP_CODE, TOTAL_COMMISSION, COMMISSION RATE
INTO :W-LAST, :W-FIRST, :W-STREEET, :W-CITY,
:W-STATE, :W-ZIP-CODE, :W-TOTAL-COMMISSION,
:W-COMMISSION-RATE
FROM SALES_REP
WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
END-EXEC.
16
Program to Display Sales Rep Information
17
Program to Display Sales Rep Information (version 2)
18
Example 3
Obtain the last name, first name, and address of the customer whose customer number is stored in the host variable, W-CUSTOMER-NUMBER, as well as the number, last name, and first name of the sales rep who represents this customer
19
Retrieve a Single Row from a JoinEXEC SQL
SELECT CUSTOMER.LAST, CUSTOMER.FIRST, CUSTOMER.STREET, CUSTOMER.CITY, CUSTOMER.STATE, CUSTOMER.ZIP_CODE, CUSTOMER.SLSREP_NUMBER, SALES_REP.LAST, SALES_REP.FIRST
INTO :W-LAST OF :W-CUSTOMER, :W-FIRST OF :W-CUSTOMER, :W-STREET OF :W-
CUSTOMER, :W-CITY OF :W-CUSTOMER,:W-STATE OF :W-CUSTMOER, :W-ZIP-CODE OF:W-CUSTOMER, :W-SLSREP-NUMBER OF :W-CUSTOMER, :W-LAST OF :W-SLAES-REP, :W-FIRST OF :W-SALES-REPFROM SALES-REP, CUSTOMERWHERE SALES-REP.SLSREP_NUMBER =
CUSTOMER.SLSREP_NUMBERAND CUSTOMER.CUSTOMER_NUMBER = :W-CUSTOMER-NUMBER
END-EXEC.
20
Example 4
Add a row to the SALES_REP table
The sales rep number, last name, first name address, total commission, and credit limit already have been placed in the variables W-SLSREP-NUMBER, W-LAST, W-FIRST, W-STREET, W-CITY, W-STATE, W-ZIP-CODE, W-TOTAL-COMMISION, and W-COMMISSION-RATE, respectively.
21
Insert a Row Into a Table
EXEC SQL
INSERT
INTO SALES_REP
VALUES (:W-SLSREP-NUMBER, :W-LAST, :W-FIRST, :W-STREET, :W-CITY, :W-STATE, :W-ZIP-CODE,
:W-TOTAL-COMMISSION, :W-COMMISSION-RATE)
END-EXEC.
22
Program to Add Sales Reps
23
Example 5
Change the last name of the sales rep whose number currently is stored in W-SLSREP-NUMBER to the value currently stored in W-LAST
24
Change A Single Row In A Table
EXEC SQL
UPDATE SALES_REP
SET LAST = :W-LAST
WHERE SLSREP_NUMBER = :WSLSREP-NUMBER
END-EXEC.
25
Example 6
Add the amount stored in the host variable INCREASE-IN-RATE to the commission rate for all sales reps who currently represent any customer having a credit limit of $1,000
26
Change Multiple Rows in a Table
EXEC SQL
UPDATE SALES_REP
SET COMMISSION_RATE = COMMISSION_RATE + :INCREASE-IN-RATE
WHERE SLSREP_NUMBER IN
(SELECT SLSREP_NUMBER
FROM CUSTOMER
WHERE CREDIT_LIMIT = 1000)
END-EXEC.
27
Example 7
Delete the sales rep whose number currently is stored in W-SLSREP-NUMBER from the SALES_REP table
28
Delete a Single Row From a Table
EXEC SQL
DELETE
FROM SALES_REP
WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
END-EXEC.
29
Example 8
Delete every order line for the order whose order number currently is stored in the host variable W-ORDER-NUMBER from the ORDER_LINE table
30
DELETE Multiple Rows From a Table
EXEC SQL
DELETE
FROM ORDER_LINE
WHERE ORDER_NUMBER = :W-ORDER-NUMBER
END-EXEC.
31
Multiple-Row SELECT
Example of SELECT statement producing multiple rowsEXEC SQL
SELECT CUSTOMER_NUMBER, LAST, FIRSTINTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRSTFROM CUSTOMERWHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
END-EXEC
Problem: COBOL can process only one record at a time,
where this SQL command produces multiple rows (records)
32
Cursors
Cursor A pointer to a row in the collection of rows
retrieved by a SQL statement Advances one row at time to provide sequential,
record-at-a-time access to the retrieved rows so COBOL can process the rows
Using a cursor, COBOL can process the set of retrieved rows as though they were records in a sequential file.
33
Example 9
Retrieve the number, last name, and first name of every customer represented by the sales rep whose number is stored in the host variable W-SLSREP-NUMBER
34
Using a Cursor
EXEC SQL
DECLARE CUSTGROUP CUROSR FOR
SELECT CUSTOMER_NUMER, LAST, FIRST
FROM CUSTOMER
WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
END-EXEC.
35
OPEN, FETCH,CLOSE
OPEN, FETCH, and CLOSE commands are used in processing a cursor
Analogous to the OPEN, READ, and CLOSE commands used in processing a sequential file
36
Opening a Cursor
EXEC SQL
OPEN CUSTGROUP
END-EXEC.
37
Before OPEN
38
After OPEN, But Before First FETCH
39
Fetching Rows from a Cursor
EXEC SQL
FETCH CUSTGROUP
INTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRST
END-EXEC.
40
After First FETCH
41
After Second FETCH
42
After Third FETCH
43
After Attempting a Fourth FETCH
44
Closing a Cursor
EXEC SQL
CLOSE CUSTGROUP
END-EXEC.
45
After CLOSE
46
Program to Display Customers of a Given Sales Rep
47
Example 10
For every order that contains an order line for the part whose part number is stored in W-PART-NUMBER, retrieve the order number, order date, last name, and first name of the customer who placed the order, and the number, last name, and first name of the sales rep who represent the customer
Sort the results by customer number
48
More Complex CursorsEXEC SQL
DECLARE ORDGROUP CURSOR FORSELECT ORDERS.ORDER_NUMBER, ORDERS.ORDER_DATE,
CUSTOMER.CUSTOMER_NUMBER, CUSTOMER.LAST, FIRST, SALES_REP.SLSREP_NUMBER, SALES_REP.LAST, FIRST
FROM ORDER_LINE, ORDERS, CUSTOMER, SALES_REPWHERE ORDER_LINE.PART_NUMBER = :W-PART-NUMBERAND ORDER_LINE.ORDER_NUMBER =
ORDERS.ORDER_NUMBERAND ORDERS.CUSTOMER_NUMBER =
CUSTOMER.CUSTOMER_NUMBERAND CUSTOMER.SLSREP_NUMBER =
SALES_REP.SLSREP_NUMBERORDER BY CUSTOMER.CUSTOMER_NUMBER
END-EXEC.
49
Advantages of Cursors
The coding the in the program is greatly simplified
A special component of the database management system called the optimizer determines the best way to access the data
If the database structure changes in such a way that the necessary information is still obtainable using a different query, the only change required in the program is the cursor definition in WORKING-STORAGE (PRODECURE DIVISION code is not affected)
50
Example 11
Add $100 to the credit limit for every customer represented by the sales rep whose number currently is stored in the host variable W-SLSREP-NUMBER, whose balance is not over the credit limit, and whose credit limit is $500 or lessAdd $200 to the credit limit of every customer of this sales rep whose balance is not over the credit limit and whose credit limit is more than $500Write the number, last name, and first name of every customer of this sales rep whose balance is greater than the credit limit
51
Updating Cursors
EXEC SQL
DECLARE CREDGROUP CURSOR FOR
SELECT CUSTOMER_NUMBER, LAST, FIRST, BALANCE, CREDIT_LIMIT
FROM CUSTOMER
WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
FOR UPDATE OF CREDIT-LIMIT
END-EXEC.
52
Code to FETCH a RowEXEC SQL
FETCH CREDGROUPINTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRST, :W-BALANCE, :W-CREDIT-LIMIT
END-EXECIF SQLCODE = 100
MOVE “NO” TO ARE-THERE-MORE-CUSTOMERSELSE
PERFORM CUSTOMER-UPDATE.CUSTOMER-UPDATE.
IF W-CREDIT-LIMIT > W-BLANCEDISPLAY W-FIRST, W-LAST
ELSE IF W-CREDIT-LIMIT > 500EXEC SQL
UPDATE CUSTOMERSET CREDIT-LIMIT = CREDIT_LIMIT + 200WHERE CURRENT OF CREDGROUP
END-EXECELSE
EXEC SQLUPDATE CUSTOMER
SET CREDIT_LIMIT = CREDIT_LIMIT + 100WHERE CURRENT OF CREDGROUP
END-EXEC.
53
Error Handling
Two types of error conditionsUnusual but normal conditionsAbnormal and unexpected conditions or
fatal errors.
54
Unusual Conditions Errors
The value in SQLCODE will be a positive number
Appropriate action is to print an error message and continue processing
Appropriate action for END OF DATA (SQLCODE-100) is termination of some loop and continuation with the rest of the program
No error message is required
55
Abnormal and Unexpected Errors
Value in SQLCODE is a negative number
Appropriate action is to print a final message that indicates the problem and terminate the program
Use the WHENEVER statement to handle these errors in a global way
56
WHENEVER Statement
EXEC SQL
WHENEVER SQLERROR GOTO ERROR-PROCESSING-ROUTINE
END-EXEC.
EXEC SQL
WHENEVER SQLWARNING CONTINUE
END-EXEC.
EXEC SQL
WHENEVER NOT FOUND CONTINUE
END-EXEC.
57
Error Codes
SQLERROR = abnormal or fatal condition (SQLCODE < 0)
SQLWARNING = unusual but normal conditions (SQLCODE > 0)
NOT FOUND = special warning END OF DATA (SQLCODE =100)
58
Summary
To embed SQL commands in a COBOL program, precede the SQL command with EXEC SQL, and follow the command with END-EXECStatements to define the tables to be accessed must appear in the DATA DIVISIONThe DATA DIVISION must contain the INCLUDE SQLCA statement, which allows access to the SQL communication areaYou can use host language variables (variables that are not columns within a table) in embedded SQL commands by preceding the variable name with a colon
59
Summary
You can use SELECT statements as embedded SQL commands in COBOL programs only when a single row is retrievedTo place the results of a SELECT statement into host language variables, use the INTO clause in the SELECT commandYou can use INSERT, UPDATE, and DELETE statements in COBOL programs, even when they affect more than one rowIf a SELECT statement is to retrieve more than one row, it must be used to define a cursor that will be used to select one row at a time
60
Summary
To activate a cursor, use the OPEN command to execute the query in the cursor definitionTo select the next row in COBOL, use the FETCH commandTo deactivate a cursor, use the CLOSE command. The rows initially retrieved will not longer be available to COBOLDATA in the tables on which a cursor is based can be updated by including the WHERE CURRENT OF cursor name clause in the update statement This clause updates only the current (most recently fetched)
row
61
Summary
To see if an error has occurred, examine the value in SQLCODE
Rather than checking SQLCODE in every place in the program where errors could occur, use the WHENEVER clause