A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

61
1 A Guide to SQL, Fifth Edition Chapter 8 Embedded SQL

Transcript of A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

Page 1: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

1

A Guide to SQL, Fifth Edition

Chapter 8Embedded SQL

Page 2: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded 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

Page 3: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 4: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 5: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 6: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

6

DATA DIVISION

Tables to be processed are declared in WORKING-STORAGE

Use the DECLARE TABLE command

Page 7: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 8: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

8

Code for Using Library

EXEC SQL

INCLUDE DECSALES_REP

END-EXEC.

Page 9: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 10: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

10

SQLCA

SQL communication area provides feedback to the program

Example:EXEC SQL

INCLUDE SQLCA

END-EXEC.

Page 11: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 12: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

12

Example 1

Obtain the last name of sales rep number 03 and place it in W-LAST

Page 13: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 14: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

14

Example 2

Obtain all information about the sales rep whose number is stored in the host variable W-SLSREP-NUMBER

Page 15: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 16: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

16

Program to Display Sales Rep Information

Page 17: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

17

Program to Display Sales Rep Information (version 2)

Page 18: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 19: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 20: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 21: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 22: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

22

Program to Add Sales Reps

Page 23: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 24: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

24

Change A Single Row In A Table

EXEC SQL

UPDATE SALES_REP

SET LAST = :W-LAST

WHERE SLSREP_NUMBER = :WSLSREP-NUMBER

END-EXEC.

Page 25: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 26: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 27: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

27

Example 7

Delete the sales rep whose number currently is stored in W-SLSREP-NUMBER from the SALES_REP table

Page 28: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

28

Delete a Single Row From a Table

EXEC SQL

DELETE

FROM SALES_REP

WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER

END-EXEC.

Page 29: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 30: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

30

DELETE Multiple Rows From a Table

EXEC SQL

DELETE

FROM ORDER_LINE

WHERE ORDER_NUMBER = :W-ORDER-NUMBER

END-EXEC.

Page 31: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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)

Page 32: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 33: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 34: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 35: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 36: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

36

Opening a Cursor

EXEC SQL

OPEN CUSTGROUP

END-EXEC.

Page 37: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

37

Before OPEN

Page 38: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

38

After OPEN, But Before First FETCH

Page 39: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

39

Fetching Rows from a Cursor

EXEC SQL

FETCH CUSTGROUP

INTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRST

END-EXEC.

Page 40: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

40

After First FETCH

Page 41: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

41

After Second FETCH

Page 42: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

42

After Third FETCH

Page 43: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

43

After Attempting a Fourth FETCH

Page 44: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

44

Closing a Cursor

EXEC SQL

CLOSE CUSTGROUP

END-EXEC.

Page 45: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

45

After CLOSE

Page 46: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

46

Program to Display Customers of a Given Sales Rep

Page 47: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 48: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 49: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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)

Page 50: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 51: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 52: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 53: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

53

Error Handling

Two types of error conditionsUnusual but normal conditionsAbnormal and unexpected conditions or

fatal errors.

Page 54: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 55: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 56: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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.

Page 57: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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)

Page 58: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 59: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 60: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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

Page 61: A Guide to SQL, Fifth Edition 1 Chapter 8 Embedded SQL.

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