Skip to main content

Problem:

Is it possible to access multiple databases within a single OpenESQL application?

Resolution:

Yes.

This is easily accomplished using named connections and the SET CONNECTION statement. At the beginning of your program you must connect to each database you wish to access.

Each CONNECT statement specifies the AS clause which associates a user-defined name to the database connection. When access to a specific database is required the SET CONNECTION statement is issued specifying the name associated with the desired database connection.

All subsequent SQL will access this database connection until another SET CONNECTION statement is issued.

Below is a simple program that demonstrates accessing an SQL Server database and a DB2 database. The program opens a cursor on the DB2 database, fetches a row and, based on the value for discount-stor-id, retrieves a row from the DB2 database.

Data Division.

01 dsqlcode pic s9(4) comp-5.

EXEC SQL INCLUDE DB2DISC END-EXEC

EXEC SQL INCLUDE discounts END-EXEC

EXEC SQL INCLUDE SQLCA END-EXEC

Procedure Division.

******************************************************************

* USE Named Connections to Connect to the Databases *

* Connection Name - DB1 For DB2 Connection *

* Connection Name - MS1 For SQL Server Connection *

******************************************************************

EXEC SQL

CONNECT TO 'UDBSAMPLE' AS DB1 USER 'dbuser.dbpass'

END-EXEC

EXEC SQL

CONNECT TO 'INTMSSQL' AS MS1 USER 'msuser.mspass'

END-EXEC

******************************************************************

* SET Named Connection To SQL Server *

******************************************************************

EXEC SQL SET CONNECTION MS1 END-EXEC

******************************************************************

* Subsequent SQL now access SQL Server *

******************************************************************

EXEC SQL

DECLARE CSR1 CURSOR FOR SELECT

A.stor_id

,A.discount

FROM dbo.discounts A

END-EXEC

EXEC SQL OPEN CSR1 END-EXEC

move sqlcode to dsqlcode

PERFORM UNTIL DSQLCODE < 0 OR DSQLCODE = 100

EXEC SQL

FETCH CSR1 INTO

:discounts-stor-id:discounts-stor-id-NULL

,:discounts-discount

END-EXEC

move sqlcode to dsqlcode

if dsqlcode =0

Perform getdata2

end-if

END-PERFORM

EXEC SQL CLOSE CSR1 END-EXEC

EXEC SQL

DISCONNECT ALL

END-EXEC

STOP RUN.

getdata2.

******************************************************************

* SET Named Connection To DB2 *

******************************************************************

EXEC SQL SET CONNECTION DB1 END-EXEC

******************************************************************

* Subsequent SQL now access DB2 *

******************************************************************

EXEC SQL

SELECT

A.ID

,A.NAME

INTO

:DB2DISC-ID:DB2DISC-ID-NULL

,:DB2DISC-NAME:DB2DISC-NAME-NULL

FROM BAS.DB2DISC A

WHERE ID=:discounts-stor-id

END-EXEC

if sqlcode = 0

display db2disc-name

end-if

******************************************************************

* SET Named Connection Back To SQL Server for Next Fetch *

******************************************************************

EXEC SQL SET CONNECTION MS1 END-EXEC.

Summary

N/A

Notes

N/A

Keywords/Phrases

ODBC Interface, SET CONNECTION, SQL

Old KB# 7040