Retrieving Single Tuples
with Embedded SQL
To illustrate the concepts of embedded SQL, we will use C as the host
programming language. When using C as the host language, an embedded SQL statement is
distinguished from programming language statements by prefixing it with the
key-words EXEC
SQL so that a preprocessor
(or precompiler) can separate
embedded SQL statements from the host language code. The SQL statements within
a program are terminated by a matching END-EXEC or by a
semicolon (;). Similar rules apply to embedding SQL in other programming
languages.
Within an embedded SQL command, we may refer to specially declared C
program variables. These are called shared
variables because they are used in both the C pro-gram and the embedded SQL
statements. Shared variables are prefixed by a colon (:) when they appear in an SQL
statement. This distinguishes program variable names from the names of database schema constructs such as attributes
(column names) and relations (table names). It also allows program variables to
have the same names as attribute names, since they are distinguishable by the
colon (:) prefix in the SQL statement. Names of database schema constructs—such
as attributes and relations—can only be used within the SQL commands, but
shared program variables can be used elsewhere in the C program without the
colon (:) prefix.
Suppose that we want to write C programs to process the COMPANY database in Figure 3.5. We need to declare program variables to match
the types of the database attributes that the program will process. The
programmer can choose the names of the program variables; they may or may not
have names that are identical to their corresponding database attributes. We
will use the C program variables declared in Figure 13.1 for all our examples and
show C program segments without variable declarations. Shared variables are
declared within a declare section in the program, as shown in Figure 13.1
(lines 1 through 7). A few of the common bindings of C types to SQL types are as follows.
The SQL types INTEGER, SMALLINT, REAL, and DOUBLE
are mapped to the C types long,
short, float, and
double,
respectively.
Fixed-length and varying-length strings (CHAR[i], VARCHAR[i]) in SQL can be mapped to arrays of characters (char
[i+1], varchar [i+1]) in C that are one character
longer than the SQL type because strings in C are terminated by a NULL
character (\0), which is not part of the
character string itself. Although varchar is not a standard C data type, it is permitted when C is used for SQL
database programming.
Notice that the only embedded SQL commands in Figure 13.1 are lines 1
and 7, which tell the precompiler to take note of the C variable names between BEGIN DECLARE
and END DECLARE because they can be included in
embedded SQL statements—as long as they are preceded by a colon (:). Lines 2
through 5 are regular C program declarations. The C program variables declared
in lines 2 through 5 correspond to the attributes of the EMPLOYEE and DEPARTMENT tables from the COMPANY database in Figure 3.5 that was
declared by the
SQL DDL in Figure 4.1. The variables declared in line 6—SQLCODE and SQLSTATE—are used to communicate errors and exception conditions between the
database system and the executing program. Line 0 shows a program variable loop that will not be used in any embed-ded SQL statement, so it is declared
outside the SQL declare section.
Connecting to the Database.
The SQL command for establishing a connection to a database has the following form:
CONNECT TO <server name>AS <connection name>
AUTHORIZATION <user account name and password> ;
In general, since a user or program can access several database servers,
several connections can be established, but only one connection can be active
at any point in time. The programmer or user can use the <connection
name> to change from the currently active connection to a different one by
using the following command:
SET CONNECTION <connection name> ;
Once a connection is no longer needed, it can be terminated by the
following command:
DISCONNECT <connection name> ;
In the examples in this chapter, we assume that the appropriate
connection has already been established to the COMPANY
database, and that it is the currently active connection.
Communicating between the
Program and the DBMS Using SQLCODE and SQLSTATE. The two
special
communication
variables
that are used by the DBMS to
communicate exception or error conditions to the program are SQLCODE and SQLSTATE. The SQLCODE variable shown in Figure 13.1 is an integer variable. After each
database command is executed, the DBMS returns a value in SQLCODE. A value of 0 indicates that the statement was executed successfully by
the DBMS. If SQLCODE
> 0 (or, more specifically, if SQLCODE = 100), this indicates that no more data
(records) are available in a query result. If SQLCODE < 0,
this indicates some error has occurred. In some systems—for example, in the
Oracle RDBMS— SQLCODE
is a field in a record structure called SQLCA (SQL communication area), so it is
referenced as SQLCA.SQLCODE. In this case, the definition of SQLCA must be
included in the C program by including the following line:
EXEC SQL include SQLCA ;
In later versions of the SQL standard, a communication variable called SQLSTATE was added, which is a string of five characters. A value of ‘00000’ in SQLSTATE indicates no error or exception; other values indicate various errors
or exceptions. For example, ‘02000’ indicates ‘no more data’ when using SQLSTATE. Currently, both SQLSTATE and SQLCODE are
available in the SQL standard. Many of the error and exception codes returned in SQLSTATE are
supposed to be standardized for all SQL vendors and platforms, whereas the codes returned in SQLCODE are not standardized but are defined by the DBMS vendor. Hence, it is
generally better to use SQLSTATE because this makes error handling
in the application programs inde-pendent of a particular DBMS. As an exercise,
the reader should rewrite the exam-ples given later in this chapter using SQLSTATE instead of SQLCODE.
Example of Embedded SQL
Programming. Our first example to illustrate embedded SQL programming is a repeating program segment (loop) that
takes as input a Social Security number of an employee and prints some
information from the corresponding EMPLOYEE record
in the database. The C program code is shown as program segment E1 in Figure
13.2. The program reads (inputs) an Ssn value
and then retrieves the EMPLOYEE tuple with that Ssn from the database via the embedded SQL command. The INTO clause (line 5) specifies the program variables into which attribute
values from the database record are retrieved. C program variables in the INTO clause are prefixed with a colon (:), as we
discussed earlier. The INTO clause can be used in this way
only when the query result is a single record; if multi-ple records are
retrieved, an error will be generated. We will see how multiple records are
handled in Section 13.2.2.
Line 7 in E1 illustrates the communication between the database and the
program through the special variable SQLCODE. If the
value returned by the DBMS in SQLCODE is 0, the previous statement was
executed without errors or exception conditions.
Line 7 checks this and assumes that if an error occurred, it was because
no EMPLOYEE tuple existed with the given Ssn;
therefore it outputs a message to that effect (line 8).
In E1 a single record is
selected by the embedded SQL query (because Ssn is a key
attribute of EMPLOYEE);. When a single record is retrieved, the programmer can assign its
attribute values directly to C program variables in the INTO clause, as in line 5. In general, an SQL query can retrieve many
tuples. In that case, the C pro-gram will typically go through the retrieved
tuples and process them one at a time. The concept of a cursor is used to allow tuple-at-a-time processing of a query
result by the host language program. We describe cursors next.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.