Specifying Queries at
Runtime Using Dynamic SQL
In the previous examples, the embedded SQL queries were written as part
of the host program source code. Hence, any time we want to write a different
query, we must modify the program code, and go through all the steps involved
(compiling, debugging, testing, and so on). In some cases, it is convenient to
write a program that can execute different SQL queries or updates (or other
operations) dynamically at runtime. For example, we may want to
write a program that accepts an SQL query
typed from the monitor, executes it, and displays its result, such as the
interactive interfaces available for most relational DBMSs. Another example is
when a user-friendly interface generates SQL queries dynamically for the user
based on point-and-click operations on a graphical schema (for example, a
QBE-like interface; see Appendix C). In this section, we give a brief overview
of dynamic SQL, which is one
technique for writing this type of database program, by giving a simple example
to illustrate how dynamic SQL can work. In Section 13.3, we will describe
another approach for dealing with dynamic queries.
Program segment E3 in Figure 13.4 reads a string that is input by the
user (that string should be an SQL update command) into the string program
variable sqlupdatestring in line
3. It then prepares this as an SQL command in line 4 by
associating it with the SQL variable sqlcommand. Line 5 then executes the command. Notice that in this case no syntax
check or other types of checks on the command are possible at compile time, since the SQL command is not available until
runtime. This contrasts with our previous examples of embedded SQL, where the
query could be checked at compile time because its text was in the program
source code.
Although including a dynamic update command is relatively
straightforward in dynamic SQL, a dynamic query is much more complicated. This
is because usually we do not know the types or the number of attributes to be
retrieved by the SQL query when we are writing the program. A complex data
structure is sometimes needed to allow for different numbers and types of
attributes in the query result if no prior information is known about the
dynamic query. Techniques similar to those that we discuss in Section 13.3 can
be used to assign query results (and query parameters) to host program
variables.
In E3, the reason for separating PREPARE and EXECUTE is that if the command is to be executed multiple times in a program,
it can be prepared only once. Preparing the command generally involves syntax
and other types of checks by the system, as
Figure 13.4 Program segment E3, a
C program segment that uses dynamic SQL for updating a table.
//Program
Segment E3:
0) EXEC SQL BEGIN DECLARE SECTION ;
1) varchar sqlupdatestring [256] ;
EXEC
SQL END DECLARE SECTION ;
...
prompt("Enter
the Update Command: ", sqlupdatestring) ;
EXEC
SQL PREPARE sqlcommand FROM :sqlupdatestring ;
EXEC
SQL EXECUTE sqlcommand ;
well as generating the code for executing it. It is possible to combine
the PREPARE and EXECUTE commands (lines 4 and 5 in E3) into a single statement by writing
EXEC SQL EXECUTE IMMEDIATE
:sqlupdatestring ;
This is useful if the command is to be executed only once.
Alternatively, the programmer can separate the two statements to catch any
errors after the PREPARE statement, if any.
Related Topics
Privacy Policy, Terms and Conditions, DMCA Policy and Compliant
Copyright © 2018-2023 BrainKart.com; All Rights Reserved. Developed by Therithal info, Chennai.