~ubuntu-branches/ubuntu/precise/postgresql-9.1/precise-security

« back to all changes in this revision

Viewing changes to doc/src/sgml/html/ecpg-dynamic.html

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-05-11 10:41:53 UTC
  • Revision ID: james.westby@ubuntu.com-20110511104153-psbh2o58553fv1m0
Tags: upstream-9.1~beta1
ImportĀ upstreamĀ versionĀ 9.1~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
2
<HTML
 
3
><HEAD
 
4
><TITLE
 
5
>Dynamic SQL</TITLE
 
6
><META
 
7
NAME="GENERATOR"
 
8
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
 
9
REV="MADE"
 
10
HREF="mailto:pgsql-docs@postgresql.org"><LINK
 
11
REL="HOME"
 
12
TITLE="PostgreSQL 9.1beta1 Documentation"
 
13
HREF="index.html"><LINK
 
14
REL="UP"
 
15
TITLE="ECPG - Embedded SQL in C"
 
16
HREF="ecpg.html"><LINK
 
17
REL="PREVIOUS"
 
18
TITLE="Using Host Variables"
 
19
HREF="ecpg-variables.html"><LINK
 
20
REL="NEXT"
 
21
TITLE="pgtypes Library"
 
22
HREF="ecpg-pgtypes.html"><LINK
 
23
REL="STYLESHEET"
 
24
TYPE="text/css"
 
25
HREF="stylesheet.css"><META
 
26
HTTP-EQUIV="Content-Type"
 
27
CONTENT="text/html; charset=ISO-8859-1"><META
 
28
NAME="creation"
 
29
CONTENT="2011-04-27T21:20:33"></HEAD
 
30
><BODY
 
31
CLASS="SECT1"
 
32
><DIV
 
33
CLASS="NAVHEADER"
 
34
><TABLE
 
35
SUMMARY="Header navigation table"
 
36
WIDTH="100%"
 
37
BORDER="0"
 
38
CELLPADDING="0"
 
39
CELLSPACING="0"
 
40
><TR
 
41
><TH
 
42
COLSPAN="5"
 
43
ALIGN="center"
 
44
VALIGN="bottom"
 
45
><A
 
46
HREF="index.html"
 
47
>PostgreSQL 9.1beta1 Documentation</A
 
48
></TH
 
49
></TR
 
50
><TR
 
51
><TD
 
52
WIDTH="10%"
 
53
ALIGN="left"
 
54
VALIGN="top"
 
55
><A
 
56
TITLE="Using Host Variables"
 
57
HREF="ecpg-variables.html"
 
58
ACCESSKEY="P"
 
59
>Prev</A
 
60
></TD
 
61
><TD
 
62
WIDTH="10%"
 
63
ALIGN="left"
 
64
VALIGN="top"
 
65
><A
 
66
TITLE="ECPG - Embedded SQL in C"
 
67
HREF="ecpg.html"
 
68
>Fast Backward</A
 
69
></TD
 
70
><TD
 
71
WIDTH="60%"
 
72
ALIGN="center"
 
73
VALIGN="bottom"
 
74
>Chapter 33. <SPAN
 
75
CLASS="APPLICATION"
 
76
>ECPG</SPAN
 
77
> - Embedded <ACRONYM
 
78
CLASS="ACRONYM"
 
79
>SQL</ACRONYM
 
80
> in C</TD
 
81
><TD
 
82
WIDTH="10%"
 
83
ALIGN="right"
 
84
VALIGN="top"
 
85
><A
 
86
TITLE="ECPG - Embedded SQL in C"
 
87
HREF="ecpg.html"
 
88
>Fast Forward</A
 
89
></TD
 
90
><TD
 
91
WIDTH="10%"
 
92
ALIGN="right"
 
93
VALIGN="top"
 
94
><A
 
95
TITLE="pgtypes Library"
 
96
HREF="ecpg-pgtypes.html"
 
97
ACCESSKEY="N"
 
98
>Next</A
 
99
></TD
 
100
></TR
 
101
></TABLE
 
102
><HR
 
103
ALIGN="LEFT"
 
104
WIDTH="100%"></DIV
 
105
><DIV
 
106
CLASS="SECT1"
 
107
><H1
 
108
CLASS="SECT1"
 
109
><A
 
110
NAME="ECPG-DYNAMIC"
 
111
>33.5. Dynamic SQL</A
 
112
></H1
 
113
><P
 
114
>   In many cases, the particular SQL statements that an application
 
115
   has to execute are known at the time the application is written.
 
116
   In some cases, however, the SQL statements are composed at run time
 
117
   or provided by an external source.  In these cases you cannot embed
 
118
   the SQL statements directly into the C source code, but there is a
 
119
   facility that allows you to call arbitrary SQL statements that you
 
120
   provide in a string variable.
 
121
  </P
 
122
><DIV
 
123
CLASS="SECT2"
 
124
><H2
 
125
CLASS="SECT2"
 
126
><A
 
127
NAME="ECPG-DYNAMIC-WITHOUT-RESULT"
 
128
>33.5.1. Executing Statements without a Result Set</A
 
129
></H2
 
130
><P
 
131
>    The simplest way to execute an arbitrary SQL statement is to use
 
132
    the command <TT
 
133
CLASS="COMMAND"
 
134
>EXECUTE IMMEDIATE</TT
 
135
>.  For example:
 
136
</P><PRE
 
137
CLASS="PROGRAMLISTING"
 
138
>EXEC SQL BEGIN DECLARE SECTION;
 
139
const char *stmt = "CREATE TABLE test1 (...);";
 
140
EXEC SQL END DECLARE SECTION;
 
141
 
 
142
EXEC SQL EXECUTE IMMEDIATE :stmt;</PRE
 
143
><P>
 
144
    <TT
 
145
CLASS="COMMAND"
 
146
>EXECUTE IMMEDIATE</TT
 
147
> can be used for SQL
 
148
    statements that do not return a result set (e.g.,
 
149
    DDL, <TT
 
150
CLASS="COMMAND"
 
151
>INSERT</TT
 
152
>, <TT
 
153
CLASS="COMMAND"
 
154
>UPDATE</TT
 
155
>,
 
156
    <TT
 
157
CLASS="COMMAND"
 
158
>DELETE</TT
 
159
>).  You cannot execute statements that
 
160
    retrieve data (e.g., <TT
 
161
CLASS="COMMAND"
 
162
>SELECT</TT
 
163
>) this way.  The
 
164
    next section describes how to do that.
 
165
   </P
 
166
></DIV
 
167
><DIV
 
168
CLASS="SECT2"
 
169
><H2
 
170
CLASS="SECT2"
 
171
><A
 
172
NAME="ECPG-DYNAMIC-INPUT"
 
173
>33.5.2. Executing a Statement with Input Parameters</A
 
174
></H2
 
175
><P
 
176
>    A more powerful way to execute arbitrary SQL statements is to
 
177
    prepare them once and execute the prepared statement as often as
 
178
    you like.  It is also possible to prepare a generalized version of
 
179
    a statement and then execute specific versions of it by
 
180
    substituting parameters.  When preparing the statement, write
 
181
    question marks where you want to substitute parameters later.  For
 
182
    example:
 
183
</P><PRE
 
184
CLASS="PROGRAMLISTING"
 
185
>EXEC SQL BEGIN DECLARE SECTION;
 
186
const char *stmt = "INSERT INTO test1 VALUES(?, ?);";
 
187
EXEC SQL END DECLARE SECTION;
 
188
 
 
189
EXEC SQL PREPARE mystmt FROM :stmt;
 
190
 ...
 
191
EXEC SQL EXECUTE mystmt USING 42, 'foobar';</PRE
 
192
><P>
 
193
   </P
 
194
><P
 
195
>    When you don't need the prepared statement anymore, you should
 
196
    deallocate it:
 
197
</P><PRE
 
198
CLASS="PROGRAMLISTING"
 
199
>EXEC SQL DEALLOCATE PREPARE <TT
 
200
CLASS="REPLACEABLE"
 
201
><I
 
202
>name</I
 
203
></TT
 
204
>;</PRE
 
205
><P>
 
206
   </P
 
207
></DIV
 
208
><DIV
 
209
CLASS="SECT2"
 
210
><H2
 
211
CLASS="SECT2"
 
212
><A
 
213
NAME="ECPG-DYNAMIC-WITH-RESULT"
 
214
>33.5.3. Executing a Statement with a Result Set</A
 
215
></H2
 
216
><P
 
217
>    To execute an SQL statement with a single result row,
 
218
    <TT
 
219
CLASS="COMMAND"
 
220
>EXECUTE</TT
 
221
> can be used.  To save the result, add
 
222
    an <TT
 
223
CLASS="LITERAL"
 
224
>INTO</TT
 
225
> clause.
 
226
</P><PRE
 
227
CLASS="PROGRAMLISTING"
 
228
>EXEC SQL BEGIN DECLARE SECTION;
 
229
const char *stmt = "SELECT a, b, c FROM test1 WHERE a &#62; ?";
 
230
int v1, v2;
 
231
VARCHAR v3[50];
 
232
EXEC SQL END DECLARE SECTION;
 
233
 
 
234
EXEC SQL PREPARE mystmt FROM :stmt;
 
235
 ...
 
236
EXEC SQL EXECUTE mystmt INTO :v1, :v2, :v3 USING 37;</PRE
 
237
><P>
 
238
    An <TT
 
239
CLASS="COMMAND"
 
240
>EXECUTE</TT
 
241
> command can have an
 
242
    <TT
 
243
CLASS="LITERAL"
 
244
>INTO</TT
 
245
> clause, a <TT
 
246
CLASS="LITERAL"
 
247
>USING</TT
 
248
> clause,
 
249
    both, or neither.
 
250
   </P
 
251
><P
 
252
>    If a query is expected to return more than one result row, a
 
253
    cursor should be used, as in the following example.
 
254
    (See <A
 
255
HREF="ecpg-commands.html#ECPG-CURSORS"
 
256
>Section 33.3.2</A
 
257
> for more details about the
 
258
    cursor.)
 
259
</P><PRE
 
260
CLASS="PROGRAMLISTING"
 
261
>EXEC SQL BEGIN DECLARE SECTION;
 
262
char dbaname[128];
 
263
char datname[128];
 
264
char *stmt = "SELECT u.usename as dbaname, d.datname "
 
265
             "  FROM pg_database d, pg_user u "
 
266
             "  WHERE d.datdba = u.usesysid";
 
267
EXEC SQL END DECLARE SECTION;
 
268
 
 
269
EXEC SQL CONNECT TO testdb AS con1 USER testuser;
 
270
 
 
271
EXEC SQL PREPARE stmt1 FROM :stmt;
 
272
 
 
273
EXEC SQL DECLARE cursor1 CURSOR FOR stmt1;
 
274
EXEC SQL OPEN cursor1;
 
275
 
 
276
EXEC SQL WHENEVER NOT FOUND DO BREAK;
 
277
 
 
278
while (1)
 
279
{
 
280
    EXEC SQL FETCH cursor1 INTO :dbaname,:datname;
 
281
    printf("dbaname=%s, datname=%s\n", dbaname, datname);
 
282
}
 
283
 
 
284
EXEC SQL CLOSE cursor1;
 
285
 
 
286
EXEC SQL COMMIT;
 
287
EXEC SQL DISCONNECT ALL;</PRE
 
288
><P>
 
289
   </P
 
290
></DIV
 
291
></DIV
 
292
><DIV
 
293
CLASS="NAVFOOTER"
 
294
><HR
 
295
ALIGN="LEFT"
 
296
WIDTH="100%"><TABLE
 
297
SUMMARY="Footer navigation table"
 
298
WIDTH="100%"
 
299
BORDER="0"
 
300
CELLPADDING="0"
 
301
CELLSPACING="0"
 
302
><TR
 
303
><TD
 
304
WIDTH="33%"
 
305
ALIGN="left"
 
306
VALIGN="top"
 
307
><A
 
308
HREF="ecpg-variables.html"
 
309
ACCESSKEY="P"
 
310
>Prev</A
 
311
></TD
 
312
><TD
 
313
WIDTH="34%"
 
314
ALIGN="center"
 
315
VALIGN="top"
 
316
><A
 
317
HREF="index.html"
 
318
ACCESSKEY="H"
 
319
>Home</A
 
320
></TD
 
321
><TD
 
322
WIDTH="33%"
 
323
ALIGN="right"
 
324
VALIGN="top"
 
325
><A
 
326
HREF="ecpg-pgtypes.html"
 
327
ACCESSKEY="N"
 
328
>Next</A
 
329
></TD
 
330
></TR
 
331
><TR
 
332
><TD
 
333
WIDTH="33%"
 
334
ALIGN="left"
 
335
VALIGN="top"
 
336
>Using Host Variables</TD
 
337
><TD
 
338
WIDTH="34%"
 
339
ALIGN="center"
 
340
VALIGN="top"
 
341
><A
 
342
HREF="ecpg.html"
 
343
ACCESSKEY="U"
 
344
>Up</A
 
345
></TD
 
346
><TD
 
347
WIDTH="33%"
 
348
ALIGN="right"
 
349
VALIGN="top"
 
350
>pgtypes Library</TD
 
351
></TR
 
352
></TABLE
 
353
></DIV
 
354
></BODY
 
355
></HTML
 
356
>
 
 
b'\\ No newline at end of file'