Chapter 8 Embedded SQL

W
Document Sample
scope of work template
							     Chapter 8
   Embedded SQL



A Guide to SQL, Fifth Edition

                                1
            Objectives
Embed SQL commands in COBOL
statements
Retrieve single rows using embedded SQL
Update a table using embedded INSERT,
UPDATE, and DELETE commands
Use cursors to retrieve multiple rows in
embedded SQL
Update a database using cursors
Learn how to handle errors in programs
containing embedded SQL commands
                                           2
         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
                                   3
           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

                                            4
          Introduction
SQLCODE contains a code indicating
the fate of the executed statement
 Normal = zero
 Not normal = value in SQLCODE that
  indicates problem
PROCEDURE DIVISION contain new
statements that will be SQL statements
with slight variations
                                         5
       DATA DIVISION
Tables to be processed are declared in
WORKING-STORAGE
Use the DECLARE TABLE command




                                         6
   Create SALES_REP Table
EXEC SQL
   DECLARE 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.
                                                7
      Code for Using Library
EXEC SQL
   INCLUDE DECSALES_REP
END-EXEC.




                               8
          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.


                                                    9
              SQLCA
SQL communication area provides
feedback to the program
Example:
  EXEC SQL
        INCLUDE SQLCA
  END-EXEC.




                                  10
  PROCEDURE DIVISION
Use Host variables
Proceed the variable with a colon
Replace results of SQL queries in host
variables in the INTO CLAUSE
SELECT LAST
   INTO :W-LAST
   FROM SALES_REP
   WHERE SLSREP_NUMBER = “03”
Make provisions for exceptional conditions

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




                                    12
Retrieve a Single Row and
         Column
In SQL:
SELECT LAST
   FROM SALES_REP
   WHERE SLSREP_NUMBER = “03”;
In COBOL:
EXEC SQL
      SELECT LAST
         INTO :W-LAST
         FROM SALES_REP
         WHERE SLSREP_NUMBER = “03”
END-EXEC.

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




                                         14
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.




                                                        15
Program to Display Sales Rep
        Information




                           16
Program to Display Sales Rep
   Information (version 2)




                           17
            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

                                           18
  Retrieve a Single Row from a Join
EXEC 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-REP
      FROM SALES-REP, CUSTOMER
      WHERE SALES-REP.SLSREP_NUMBER =
      CUSTOMER.SLSREP_NUMBER
      AND CUSTOMER.CUSTOMER_NUMBER =
      :W-CUSTOMER-NUMBER
END-EXEC.                                       19
             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.


                                           20
    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.




                                                     21
Program to Add Sales Reps




                            22
           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




                                         23
  Change A Single Row In A
           Table
EXEC SQL
   UPDATE SALES_REP
      SET LAST = :W-LAST
      WHERE SLSREP_NUMBER = :WSLSREP-NUMBER
END-EXEC.




                                              24
           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




                                      25
   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.




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




                                    27
 Delete a Single Row From a
            Table
EXEC SQL
   DELETE
      FROM SALES_REP
      WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
END-EXEC.




                                               28
           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




                                         29
DELETE Multiple Rows From
        a Table
EXEC SQL
   DELETE
      FROM ORDER_LINE
      WHERE ORDER_NUMBER = :W-ORDER-NUMBER
END-EXEC.




                                             30
     Multiple-Row SELECT
Example of SELECT statement producing
multiple rows
EXEC SQL
   SELECT CUSTOMER_NUMBER, LAST, FIRST
      INTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRST
      FROM CUSTOMER
      WHERE 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)
                                                   31
                   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.


                                                       32
           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




                                       33
            Using a Cursor
EXEC SQL
   DECLARE CUSTGROUP CUROSR FOR
      SELECT CUSTOMER_NUMER, LAST, FIRST
      FROM CUSTOMER
      WHERE SLSREP_NUMBER = :W-SLSREP-NUMBER
END-EXEC.




                                               34
  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




                                35
         Opening a Cursor
EXEC SQL
   OPEN CUSTGROUP
END-EXEC.




                            36
Before OPEN




              37
After OPEN, But Before First
         FETCH




                               38
 Fetching Rows from a Cursor
EXEC SQL
   FETCH CUSTGROUP
      INTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRST
END-EXEC.




                                                   39
After First FETCH




                    40
After Second FETCH




                     41
After Third FETCH




                    42
After Attempting a Fourth
          FETCH




                            43
          Closing a Cursor
EXEC SQL
   CLOSE CUSTGROUP
END-EXEC.




                             44
After CLOSE




              45
Program to Display Customers of a
        Given Sales Rep




                                    46
             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


                                              47
      More Complex Cursors
EXEC SQL
   DECLARE ORDGROUP CURSOR FOR
      SELECT 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_REP
      WHERE ORDER_LINE.PART_NUMBER = :W-PART-NUMBER
      AND ORDER_LINE.ORDER_NUMBER =
         ORDERS.ORDER_NUMBER
      AND ORDERS.CUSTOMER_NUMBER =
         CUSTOMER.CUSTOMER_NUMBER
      AND CUSTOMER.SLSREP_NUMBER =
         SALES_REP.SLSREP_NUMBER
      ORDER BY CUSTOMER.CUSTOMER_NUMBER
END-EXEC.
                                                       48
    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)

                                                        49
              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 less
Add $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 $500
Write the number, last name, and first name of every
customer of this sales rep whose balance is greater
than the credit limit

                                                     50
          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.




                                               51
                 Code to FETCH a Row
EXEC SQL
      FETCH CREDGROUP
            INTO :W-CUSTOMER-NUMBER, :W-LAST, :W-FIRST, :W-BALANCE, :W-CREDIT-LIMIT
END-EXEC
IF SQLCODE = 100
      MOVE “NO” TO ARE-THERE-MORE-CUSTOMERS
ELSE
      PERFORM CUSTOMER-UPDATE.
CUSTOMER-UPDATE.
      IF W-CREDIT-LIMIT > W-BLANCE
            DISPLAY W-FIRST, W-LAST
      ELSE IF W-CREDIT-LIMIT > 500
            EXEC SQL
                  UPDATE CUSTOMER
                       SET CREDIT-LIMIT = CREDIT_LIMIT + 200
                       WHERE CURRENT OF CREDGROUP
            END-EXEC
      ELSE
            EXEC SQL
                  UPDATE CUSTOMER
                       SET CREDIT_LIMIT = CREDIT_LIMIT + 100
                       WHERE CURRENT OF CREDGROUP
END-EXEC.


                                                                                      52
         Error Handling
Two types of error conditions
 Unusual but normal conditions
 Abnormal and unexpected conditions or
  fatal errors.




                                          53
 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

                                                54
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

                                     55
     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.




                                                 56
         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)


                                  57
                Summary
To embed SQL commands in a COBOL program,
precede the SQL command with EXEC SQL, and
follow the command with END-EXEC
Statements to define the tables to be accessed must
appear in the DATA DIVISION
The DATA DIVISION must contain the INCLUDE
SQLCA statement, which allows access to the SQL
communication area
You 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
                                                      58
                Summary
You can use SELECT statements as embedded SQL
commands in COBOL programs only when a single
row is retrieved
To place the results of a SELECT statement into host
language variables, use the INTO clause in the
SELECT command
You can use INSERT, UPDATE, and DELETE
statements in COBOL programs, even when they
affect more than one row
If 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
                                                   59
                    Summary
To activate a cursor, use the OPEN command to
execute the query in the cursor definition
To select the next row in COBOL, use the FETCH
command
To deactivate a cursor, use the CLOSE command.
The rows initially retrieved will not longer be available
to COBOL
DATA 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
                                                               60
                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




                                                    61

						
Related docs
Other docs by gjjur4356
Chapter 82011455721
Views: 1  |  Downloads: 0
Same Day Payout Loans- Get Cash the Same Day
Views: 49  |  Downloads: 0
FEEDING YOUR GUN DOG …by Bryan Taylor
Views: 150  |  Downloads: 0
USDA Outlook Forum ECOVAL DAIRY TRADE
Views: 16  |  Downloads: 0
Serviced Office Space Explained (DOC)
Views: 25  |  Downloads: 0
Letters
Views: 88  |  Downloads: 0