Your Federal Quarterly Tax Payments are due April 15th Get Help Now >>

Chapter 8 Embedded SQL - PowerPoint by ygq15756

VIEWS: 119 PAGES: 54

									     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.
Note: This is the database representation of the data   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.

  Note: This is where the database data will be stored for processing by COBOL


                                                                                 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  this is a COBOL variable name
   FROM SALES_REP
   WHERE SLSREP_NUMBER = “03”  This is DB variable
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
            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

                                           16
  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.                                       17
             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.


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




                                                     19
           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




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




                                              21
           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




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




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




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




                                               25
           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




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




                                             27
     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)
                                                   28
                   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.


                                                       29
           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




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




                                               31
  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




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



This causes the Cursor’s SQL statement to be executed




                                                        33
Before OPEN




              34
After OPEN, But Before First
         FETCH




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




                                                   36
After First FETCH




                    37
After Second FETCH




                     38
After Third FETCH




                    39
After Attempting a Fourth
          FETCH




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




                             41
             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


                                              42
      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.
                                                       43
    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)

                                                        44
              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

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




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


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




                                          48
 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

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


                                  50
                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 / WORKING-
STORAGE
The DATA DIVISION / WORKING-STORAGE 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
                                                      51
                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
                                                   52
                    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
                                                               53
                Summary
To see if an error has occurred, examine the value in
SQLCODE
USE EVALUATE




                                                    54

								
To top