Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
postgres-lambda-diff
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jakob Huber
postgres-lambda-diff
Commits
9abf246b
Commit
9abf246b
authored
26 years ago
by
Michael Meskes
Browse files
Options
Downloads
Patches
Plain Diff
*** empty log message ***
parent
5ae9d85f
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
doc/src/sgml/ecpg.sgml
+286
-206
286 additions, 206 deletions
doc/src/sgml/ecpg.sgml
with
286 additions
and
206 deletions
doc/src/sgml/ecpg.sgml
+
286
−
206
View file @
9abf246b
...
...
@@ -29,7 +29,7 @@ This describes an embedded <Acronym>SQL</Acronym> in <Acronym>C</Acronym>
package for <ProductName>Postgres</ProductName>.
It is written by <ULink url="mailto:linus@epact.se">Linus Tolke</ULink>
and <ULink url="mailto:meskes@
debian
.org">Michael Meskes</ULink>.
and <ULink url="mailto:meskes@
postgresql
.org">Michael Meskes</ULink>.
<Note>
<Para>
...
...
@@ -143,10 +143,8 @@ Debug logging is done on <replaceable class="parameter">stream</replaceable>.
<Para>
The most important one (<Function>ECPGdo</Function>)
that is called on all <Acronym>SQL</Acronym>
statements except <Command>EXEC SQL COMMIT</Command>,
<Command>EXEC SQL ROLLBACK</Command>,
<Command>EXEC SQL CONNECT</Command> logs both its expanded string,
that is called on almost all <Acronym>SQL</Acronym>
statements logs both its expanded string,
i.e. the string
with all the input variables inserted, and the result from the
<ProductName>Postgres</ProductName> server.
...
...
@@ -177,12 +175,37 @@ exec sql include sqlca;
in the include section of your file. This will define a struct and a
variable with the name <Parameter>sqlca</Parameter> as following:
<ProgramListing>
struct sqlca {
int sqlcode;
struct {
int sqlerrml;
char sqlerrmc[1000];
} sqlerrm;
struct sqlca
{
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct
{
int sqlerrml;
char sqlerrmc[70];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
/* 0: empty */
/* 1: empty */
/* 2: number of rows processed in an INSERT, UPDATE */
/* or DELETE statement */
/* 3: empty */
/* 4: empty */
/* 5: empty */
char sqlwarn[8];
/* 0: set to 'W' if at least one other is 'W' */
/* 1: if 'W' at least one character string */
/* value was truncated when it was */
/* stored into a host variable. */
/* 2: empty */
/* 3: empty */
/* 4: empty */
/* 5: empty */
/* 6: empty */
/* 7: empty */
char sqlext[8];
} sqlca;
</ProgramListing>
</Para>
...
...
@@ -199,9 +222,8 @@ the table did not contain the requested row.
<Para>
sqlca.sqlerrm.sqlerrmc will contain a string that describes the error.
The string ends with <Quote>line 23.</Quote> where the line is the line number
in the source file (actually the file generated by the preprocessor but
I hope I can fix this to be the line number in the input file.)
The string ends with the line number
in the source file.
</Para>
<Para>
...
...
@@ -209,77 +231,63 @@ List of errors that can occur:
<VariableList>
<VarListEntry>
<Term>-1,
Unsupported type %s o
n line %d.</Term>
<Term>-1
2
,
Out of memory i
n line %d.</Term>
<ListItem>
<Para>
Does not normally occur. This is a sign that the preprocessor has
generated something that the library does not know about. Perhaps you
are running incompatible versions of the preprocessor and the library.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-1, Too many arguments line %d.</Term>
<ListItem>
<Para>
The preprocessor has goofed up and generated some incorrect code.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-1, Too few arguments line %d.</Term>
<ListItem>
<Para>
The preprocessor has goofed up and generated some incorrect code.
Does not normally occur. This is a sign that your virtual memory is
exhausted.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1, Error starting transacti
on line %d.</Term>
<Term>-
200, Unsupported type %s
on line %d.</Term>
<ListItem>
<Para>
<ProductName>Postgres</ProductName> signalled to us that we cannot open
the connection.
Does not normally occur. This is a sign that the preprocessor has
generated something that the library does not know about. Perhaps you
are running incompatible versions of the preprocessor and the library.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-1,
Postgres error: %
s line %d.</Term>
<Term>-
20
1,
Too many argument
s line %d.</Term>
<ListItem>
<Para>
Some <ProductName>Postgres</ProductName> error.
The message contains the error message from the
<ProductName>Postgres</ProductName> backend.
This means that <ProductName>Postgres</ProductName> has returned more
arguments than we have
matching variables. Perhaps you have forgotten a couple of the host
variables in the <Command>INTO :var1,:var2</Command>-list.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
1, Data not found
line %d.</Term>
<Term>
-202, Too few arguments
line %d.</Term>
<ListItem>
<Para>
This is a "normal" error that tells you that what you are quering cannot
be found or we have gone through the cursor.
</Para>
This means that <ProductName>Postgres</ProductName> has returned fewer
arguments than we have
host variables. Perhaps you have too many host variables in the
<Command>INTO :var1,:var2</Command>-list.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1
, To many matches line %d.</Term>
<Term>-
203
, To
o
many matches line %d.</Term>
<ListItem>
<Para>
This means that the query has returned several lines.
The <Command>SELECT</Command> you made probably was not unique.
This means that the query has returned several lines but the
variables specified are no arrays. The <Command>SELECT</Command> you made
probably was not unique.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1
, Not correctly formatted int type: %s line %d.</Term>
<Term>-
204
, Not correctly formatted int type: %s line %d.</Term>
<ListItem>
<Para>
This means that the host variable is of an <Type>int</Type> type and the field
...
...
@@ -292,7 +300,7 @@ for this conversion.
</VarListEntry>
<VarListEntry>
<Term>-
1
, Not correctly formatted unsigned type: %s line %d.</Term>
<Term>-
205
, Not correctly formatted unsigned type: %s line %d.</Term>
<ListItem>
<Para>
This means that the host variable is of an <Type>unsigned int</Type> type and
...
...
@@ -305,10 +313,10 @@ uses <Function>strtoul</Function> for this conversion.
</VarListEntry>
<VarListEntry>
<Term>-
1
, Not correctly formatted floating point type: %s line %d.</Term>
<Term>-
206
, Not correctly formatted floating point type: %s line %d.</Term>
<ListItem>
<Para>
This means that the host variable is of a
n
<Type>float</Type> type and
This means that the host variable is of a <Type>float</Type> type and
the field in the <ProductName>Postgres</ProductName> database is of another
type and contains a
value that cannot be interpreted as an <Type>float</Type>. The library
...
...
@@ -318,96 +326,93 @@ uses <Function>strtod</Function> for this conversion.
</VarListEntry>
<VarListEntry>
<Term>-
1, Too few arguments
line %d.</Term>
<Term>-
207, Unable to convert %s to bool on
line %d.</Term>
<ListItem>
<Para>
This means that <ProductName>Postgres</ProductName> has returned more records
than we have
matching variables. Perhaps you have forgotten a couple of the host
variables in the <Command>INTO :var1,:var2</Command>-list.
This means that the host variable is of a <Type>bool</Type> type and
the field in the <ProductName>Postgres</ProductName> database is neither 't'
nor 'f'.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1, Too many arguments
line %d.</Term>
<Term>-
208, Empty query
line %d.</Term>
<ListItem>
<Para>
This means that <ProductName>Postgres</ProductName> has returned fewer records
than we have
host variables. Perhaps you have to many host variables in the
<Command>INTO :var1,:var2</Command>-list.
<ProductName>Postgres</ProductName> returned PGRES_EMPTY_QUERY, probably
because the query indeed was empty.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1, Empty query
line %d.</Term>
<Term>-
220, No such connection %s in
line %d.</Term>
<ListItem>
<Para>
<ProductName>Postgres</ProductName> returned PGRES_EMPTY_QUERY
.
The program tries to access a connection that does not exist
.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-1,
Error: %s
line %d.</Term>
<Term>-
22
1,
Not connected in
line %d.</Term>
<ListItem>
<Para>
This means that <ProductName>Postgres</ProductName> returned on of the errors
PGRES_NONFATAL_ERROR, PGRES_FATAL_ERROR or PGRES_BAD_RESPONSE. Which one
and why is explained in the message.
The program tries to access a connection that does exist but is not open.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1, Postgres error
line %d.</Term>
<Term>-
230, Invalid statement name %s in
line %d.</Term>
<ListItem>
<Para>
<ProductName>Postgres</ProductName> returns something that the library does
not know how to
handle. This is probably because the version of
<ProductName>Postgres</ProductName> does not
match the version of the <Application>ecpg</Application> library.
The statement you are trying to use has not been prepared.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1, Error committing
line %d.</Term>
<Term>-
400, Postgres error: %s
line %d.</Term>
<ListItem>
<Para>
Error during <Command>COMMIT</Command>. <Command>EXEC SQL COMMIT</Command>
is translated to an
<Command>end</Command> operation in <ProductName>Postgres</ProductName>
and that is the operation that could
not be performed.
Some <ProductName>Postgres</ProductName> error.
The message contains the error message from the
<ProductName>Postgres</ProductName> backend.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-1, Error
rolling back
line %d.</Term>
<Term>-
40
1, Error
in transaction processing
line %d.
</Term>
<ListItem>
<Para>
Error during <Command>ROLLBACK</Command>.
<Command>EXEC SQL ROLLBACK</Command> is translated to
an <Command>abort</Command> operation in <ProductName>Postgres</ProductName>
and that is the operation that
could not be performed.
<ProductName>Postgres</ProductName> signalled to us that we cannot start,
commit or rollback the transaction.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>-
1, ECPG
connect: could not open database %s.</Term>
<Term>-
402,
connect: could not open database %s.</Term>
<ListItem>
<Para>
The connect to the database did not work.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>100, Data not found line %d.</Term>
<ListItem>
<Para>
This is a "normal" error that tells you that what you are quering cannot
be found or we have gone through the cursor.
</Para>
</ListItem>
</VarListEntry>
</VariableList>
</Para>
</Sect2>
...
...
@@ -447,9 +452,41 @@ that effort can not justify the performance gained.
<Title>Porting From Other <Acronym>RDBMS</Acronym> Packages</Title>
<Para>
To be written by someone who knows the different
<Acronym>RDBMS</Acronym> packages and who
actually does port something...
The design of <Application>ecpg</Application> follows SQL standard. So
porting from a standard RDBMS should not be a problem. Unfortunately there
is no such thing as a standard RDBMS. So <Application>ecpg</Application>
also tries to understand syntax additions as long as they do not create
conflicts with the standard.
</Para>
<Para>
The following list shows all the known incompatibilities. If you find one
not listed please notify <ULink url="mailto:meskes@postgresql.org">Michael
Meskes</ULink>. Note, however, that we list only incompatibilities from
a precompiler of another RDBMS to <Application>ecpg</Application> and not
additional <Application>ecpg</Application> features that these RDBMS do not
have.
</Para>
<Para>
<VariableList>
<VarListEntry>
<Term>Syntax of FETCH command</Term>
<ListItem>
<Para>
The standard syntax of the FETCH command is:
<Para>
FETCH [direction] [amount] IN|FROM <Replaceable>cursor name</Replaceable>.
</Para>
<Application>ORACLE</Application>, however, does not use the keywords IN
resp. FROM. This feature cannot be added since it would create parsing
conflicts.
</Para>
</ListItem>
</VarListEntry>
</VariableList>
</Para>
</sect1>
...
...
@@ -487,67 +524,31 @@ This version the preprocessor has some flaws:
<VariableList>
<VarListEntry>
<Term>no restriction to strings only</Term>
<ListItem>
<Para>
The PQ interface, and most of all the PQexec function, that is used by
the <Application>ecpg</Application> relies on that the request is built
up as a string. In some
cases, like when the data contains the null character, this will be a
serious problem.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>error codes</Term>
<ListItem>
<Para>
There should be different error numbers for the different errors instead
of just -1 for them all.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>library functions</Term>
<Term>Library functions</Term>
<ListItem>
<Para>
to_date et al.
to_date et al. do not exists. But then <ProductName>Postgres</ProductName>
has some good conversion routines itself. So you probably won't miss these.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
record
s</Term>
<Term>
Structures ans union
s</Term>
<ListItem>
<Para>
Records or structure
s have to be defined in the declare section.
Structures and union
s have to be defined in the declare section.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>
m
issing statements</Term>
<Term>
M
issing statements</Term>
<ListItem>
<Para>
The following statements are not implemented thus far:
<VariableList>
<VarListEntry>
<Term> exec sql type</Term>
<ListItem>
<Para>
</Para>
</listitem>
</VarListEntry>
<VarListEntry>
<Term> exec sql prepare</Term>
<ListItem>
<Para>
</Para>
</listitem>
</VarListEntry>
<VarListEntry>
<Term> exec sql allocate</Term>
<ListItem>
<Para>
...
...
@@ -555,14 +556,7 @@ The following statements are not implemented thus far:
</listitem>
</VarListEntry>
<VarListEntry>
<Term> exec sql free</Term>
<ListItem>
<Para>
</Para>
</listitem>
</VarListEntry>
<VarListEntry>
<Term> exec sql whenever sqlwarning</Term>
<Term> exec sql deallocate</Term>
<ListItem>
<Para>
</Para>
...
...
@@ -581,7 +575,7 @@ The following statements are not implemented thus far:
</VarListEntry>
<VarListEntry>
<Term>message
´
no data found
´
</Term>
<Term>message
'
no data found
'
</Term>
<ListItem>
<Para>
The error message for "no data" in an exec sql insert select from statement
...
...
@@ -591,7 +585,7 @@ has to be 100.
</VarListEntry>
<VarListEntry>
<Term>sqlwa
n
r[6]</Term>
<Term>sqlwar
n
[6]</Term>
<ListItem>
<Para>
sqlwarn[6] should be 'W' if the PRECISION or SCALE value specified in a SET
...
...
@@ -599,25 +593,6 @@ DESCRIPTOR statement will be ignored.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>conversion of scripts</Term>
<ListItem>
<Para>
To set up a database you need a few scripts with table definitions and
other configuration parameters. If you have these scripts for an old
database you would like to just apply them to get a
<ProductName>Postgres</ProductName> database that works in the same way.
</Para>
<Para>
To set up a database you need a few scripts with table definitions and
The functionality could be accomplished with some conversion scripts.
Speed will never be accomplished in this way. To do this you need a
bigger insight in the database construction and the use of the database
than could be realised in a script.
</Para>
</ListItem>
</VarListEntry>
</VariableList>
</Para>
</sect2>
...
...
@@ -626,19 +601,20 @@ than could be realised in a script.
<Title>The Preprocessor</Title>
<Para>
First four lines are written to the output. Two comments and two include
lines necessary for the interface to the library.
The first four lines written to the output are constant additions by ecpg.
These are two comments and two include lines necessary for the interface to the
library.
</Para>
<Para>
Then the preprocessor works in one pass only reading the input file and
Then the preprocessor works in one pass only
,
reading the input file and
writing to the output as it goes along. Normally it just echoes
everything to the output without looking at it further.
</Para>
<Para>
When it comes to an <Command>EXEC SQL</Command> statements it interv
i
ens and
changes them depending on what
i
it is.
When it comes to an <Command>EXEC SQL</Command> statements it interven
e
s and
changes them depending on what it is.
The <Command>EXEC SQL</Command> statement can be one of these:
<VariableList>
...
...
@@ -659,6 +635,12 @@ declare within this section is also entered in a list of variables
indexed on their name together with the corresponding type.
</Para>
<Para>
In particular the definition of a structure or union also has to be listed
inside a declare section. Otherwise <Application>ecpg</Application> cannot
handle these types since it simply does not know the definition.
</Para>
<Para>
The declaration is echoed to the file to make the variable a normal
C-variable also.
...
...
@@ -686,11 +668,17 @@ An include statement looks like:
<ProgramListing>
exec sql include filename;
</ProgramListing>
It is converted into
Not that this is NOT the same as
<ProgramListing>
#include <filename.h>
</ProgramListing>
</Para>
<Para>
Instead the file specified is parsed by <Application>ecpg</Application>
itself. So the contents of the specified file is included in the resulting C
code. This way you are able to specify EXEC SQL commands in an include file.
</Para>
</ListItem>
</VarListEntry>
...
...
@@ -700,16 +688,102 @@ It is converted into
<Para>
A connect statement looks like:
<ProgramListing>
exec sql connect
'
<Replaceable>
database
</Replaceable>
'
;
exec sql connect
to
<Replaceable>
connection target
</Replaceable>;
</ProgramListing>
That statement is converted into
It creates a connection to the specified database.
</Para>
<Para>
The <Replaceable>connection target</Replaceable> can be specified in the
following ways:
<VariableList>
<VarListEntry>
<Term>dbname[@server][:port][as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term>
</VarListEntry>
<VarListEntry>
<Term>tcp:postgresql://server[:port][/dbname][as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term>
</VarListEntry>
<VarListEntry>
<Term>unix:postgresql://server[:port][/dbname][as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term>
</VarListEntry>
<VarListEntry>
<Term><Replaceable>character variable</Replaceable>[as <Replaceable>connection name</Replaceable>][user <Replaceable>user name</Replaceable>]</Term>
</VarListEntry>
<VarListEntry>
<Term><Replaceable>character string</Replaceable>[as <Replaceable>connection name</Replaceable>][<Replaceable>user</Replaceable>]</Term>
</VarListEntry>
<VarListEntry>
<Term>default</Term>
</VarListEntry>
<VarListEntry>
<Term>user</Term>
</VarListEntry>
</VariableList>
</Para>
<Para>
There are also different ways to specify the user name:
<VariableList>
<VarListEntry>
<Term><Replaceable>userid</Replaceable></Term>
</VarListEntry>
<VarListEntry>
<Term><Replaceable>userid</Replaceable>/<Replaceable>password</Replaceable></Term>
</VarListEntry>
<VarListEntry>
<Term><Replaceable>userid</Replaceable> identified by <Replaceable>password</Replaceable></Term>
</VarListEntry>
<VarListEntry>
<Term><Replaceable>userid</Replaceable> using <Replaceable>password</Replaceable></Term>
</VarListEntry>
</VariableList>
</Para>
<Para> Finally the userid and the password. Each may be a constant text, a
character variable or a chararcter string.
</Para>
</ListItem>
</VarListEntry>
<VarListEntry>
<Term>Disconnect statements</Term>
<ListItem>
<Para>
A disconnect statement looks loke:
<ProgramListing>
ECPG
connect
("
<Replaceable>
database
</Replaceable>
")
;
exec sql dis
connect
[
<Replaceable>
connection target
</Replaceable>
]
;
</ProgramListing>
It closes the connection to the specified database.
</Para>
<Para>
The <Replaceable>connection target</Replaceable> can be specified in the
following ways:
<VariableList>
<VarListEntry>
<Term><Replaceable>connection name</Replaceable></Term>
</VarListEntry>
<VarListEntry>
<Term>default</Term>
</VarListEntry>
<VarListEntry>
<Term>current</Term>
</VarListEntry>
<VarListEntry>
<Term>all</Term>
</VarListEntry>
</VariableList>
</Para>
</ListItem>
</VarListEntry>
WARNING: FROM HERE ON THE TEXT IS OUTDATED!
<VarListEntry>
<Term>Open cursor statement</Term>
<ListItem>
...
...
@@ -755,6 +829,7 @@ ECPGrollback(__LINE__);
</ListItem>
</VarListEntry>
STARTING HERE IT IS OKAY AGAIN!
<VarListEntry>
<Term>Other statements</Term>
<ListItem>
...
...
@@ -767,32 +842,30 @@ as an <Acronym>SQL</Acronym> statement and parsed for variable substitution.
<Para>
Variable substitution occur when a symbol starts with a colon
(<Command>:</Command>).
Then a variable with that name is found among the variables
that were previously declared within a declare section and depending on
whether or not the <Acronym>SQL</Acronym> statements knows it to be
a variable for input or
output the pointers to the variables are written to the output to allow
for access by the function.
(<Command>:</Command>). Then a variable with that name is looked for among
the variables that were previously declared within a declare section and
depending on the variable being for input or output the pointers to the
variables are written to the output to allow for access by the function.
</Para>
<Para>
For every variable that is part of the <Acronym>SQL</Acronym> request
the function gets another
five
arguments:
the function gets another
ten
arguments:
<SimpleList>
<Member>The type as a special symbol</Member>
<Member>A pointer to the value</Member>
<Member>The size of the variable if it is a varchar</Member>
<Member>Number of elements in the array (for array fetches)</Member>
<Member>The type as a special symbol
.
</Member>
<Member>A pointer to the value
or a pointer to the pointer.
</Member>
<Member>The size of the variable if it is a
char or
varchar
.
</Member>
<Member>Number of elements in the array (for array fetches)
.
</Member>
<Member>The offset to the next element in the array (for array fetches)</Member>
<Member>The type of the indicator variable as a special symbol.</Member>
<Member>A pointer to the value of the indicator variable or a pointer to the pointer of the indicator variable.</Member>
<Member>0.</Member>
<Member>Number of elements in the indicator array (for array fetches).</Member>
<Member>The offset to the next element in the indicator array (for array fetches)</Member>
</SimpleList>
</Para>
<Para>
Since the array fetches are not implemented yet the two last arguments
are not really important. They could perhaps have been left out.
</Para>
</ListItem>
</VarListEntry>
</VariableList>
...
...
@@ -803,32 +876,38 @@ are not really important. They could perhaps have been left out.
<Title>A Complete Example</Title>
<Para>
Here is a complete example describing the output of the preprocessor:
Here is a complete example describing the output of the preprocessor of a
file foo.pgc:
<ProgramListing>
exec sql begin declare section;
int index;
int result;
exec sql end declare section;
...
exec sql select res into :result from mytable where index = :index;
exec sql select res into :result from mytable where index = :index;
</ProgramListing>
is translated into:
<ProgramListing>
/* Processed by ecpg (2.6.0) */
/* These two include files are added by the preprocessor */
#include <ecpgtype.h>
#include <ecpglib.h>
#include <ecpgtype.h>;
#include <ecpglib.h>;
/* exec sql begin declare section */
#line 1 "foo.pgc"
int index;
int result;
/* exec sql end declare section */
...
ECPGdo(__LINE__, "select res from mytable where index = ;;",
ECPGt_int,&index,0,0,sizeof(int),
ECPGt_EOIT,
ECPGt_int,&result,0,0,sizeof(int),
ECPGt_EORT );
ECPGdo(__LINE__, NULL, "select res from mytable where index = ? ",
ECPGt_int,&(index),1L,1L,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT,
ECPGt_int,&(result),1L,1L,sizeof(int),
ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);
#line 147 "foo.pgc"
</ProgramListing>
(the indentation in this manual is added for readability and not
something that the preprocessor can do.)
...
...
@@ -840,9 +919,9 @@ something that the preprocessor can do.)
<Para>
The most important function in the library is the <Function>ECPGdo</Function>
function. It takes a variable amount of arguments. Hopefully we wo
n
t run
function. It takes a variable amount of arguments. Hopefully we w
ill n
ot run
into machines with limits on the amount of variables that can be
accepted by a var
ch
ar function. This could easily add up to 50 or so
accepted by a varar
g
function. This could easily add up to 50 or so
arguments.
</Para>
...
...
@@ -877,7 +956,7 @@ should go the string contains <Quote>;</Quote>.
<ListItem>
<Para>
As described in the section about the preprocessor every input variable
gets
five
arguments.
gets
ten
arguments.
</Para>
</ListItem>
</VarListEntry>
...
...
@@ -896,7 +975,7 @@ An enum telling that there are no more input variables.
<ListItem>
<Para>
As described in the section about the preprocessor every input variable
gets
five
arguments. These variables are filled by the function.
gets
ten
arguments. These variables are filled by the function.
</Para>
</ListItem>
</VarListEntry>
...
...
@@ -913,10 +992,11 @@ An enum telling that there are no more variables.
</Para>
<Para>
All the <Acronym>SQL</Acronym> statements are performed in one transaction
unless you issue
a commit transaction. This works so that the first transaction or the
first after a commit or rollback always begins a transaction.
All the <Acronym>SQL</Acronym> statements are performed in one transaction
unless you issue a commit transaction. To get this auto-transaction going
the first statement or the first after statement after a commit or rollback
always begins a transaction. To disable this feature per default use the
'-t' option on the commandline
</Para>
<Para>
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment