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

Post on 19-Jan-2016

248 views 0 download

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