| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- '\"
- '\" tdbc_statement.n --
- '\"
- '\" Copyright (c) 2008 by Kevin B. Kenny.
- '\"
- '\" See the file "license.terms" for information on usage and redistribution of
- '\" this file, and for a DISCLAIMER OF ALL WARRANTIES.
- .TH "tdbc::statement" n 8.6 Tcl "Tcl Database Connectivity"
- '\" .so man.macros
- '\" IGNORE
- .if t .wh -1.3i ^B
- .nr ^l \n(.l
- .ad b
- '\" # BS - start boxed text
- '\" # ^y = starting y location
- '\" # ^b = 1
- .de BS
- .br
- .mk ^y
- .nr ^b 1u
- .if n .nf
- .if n .ti 0
- .if n \l'\\n(.lu\(ul'
- .if n .fi
- ..
- '\" # BE - end boxed text (draw box now)
- .de BE
- .nf
- .ti 0
- .mk ^t
- .ie n \l'\\n(^lu\(ul'
- .el \{\
- '\" Draw four-sided box normally, but don't draw top of
- '\" box if the box started on an earlier page.
- .ie !\\n(^b-1 \{\
- \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
- .\}
- .el \}\
- \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
- .\}
- .\}
- .fi
- .br
- .nr ^b 0
- ..
- '\" # CS - begin code excerpt
- .de CS
- .RS
- .nf
- .ta .25i .5i .75i 1i
- ..
- '\" # CE - end code excerpt
- .de CE
- .fi
- .RE
- ..
- '\" END IGNORE
- .BS
- .SH "NAME"
- tdbc::statement \- TDBC statement object
- .SH "SYNOPSIS"
- .nf
- package require \fBtdbc 1.0\fR
- package require \fBtdbc::\fR\fIdriver version\fR
- \fBtdbc::\fR\fIdriver\fR\fB::connection create \fR\fIdb\fR \fI?\-option value\fR...?
- \fBset\fR \fIstmt\fR \fB[\fR\fIdb\fR \fBprepare\fR \fIsql-code\fR\fB]\fR
- \fBset\fR \fIstmt\fR \fB[\fR\fIdb\fR \fBpreparecall\fR \fIcall\fR\fB]\fR
- \fI$stmt\fR \fBparams\fR
- \fI$stmt\fR \fBparamtype\fR ?\fIdirection\fR? \fItype\fR ?\fIprecision\fR? ?\fIscale\fR?
- \fI$stmt\fR \fBexecute\fR ?\fIdict\fR?
- \fI$stmt\fR \fBresultsets\fR
- .fi
- .ad l
- .in 14
- .ti 7
- \fI$stmt\fR \fBallrows\fR ?\fB-as lists|dicts\fR? ?\fB-columnsvariable\fR \fIname\fR? ?\fB--\fR? ?\fIdict\fR
- .br
- .ti 7
- \fI$stmt\fR \fBforeach\fR ?\fB-as lists|dicts\fR? ?\fB-columnsvariable\fR \fIname\fR? ?\fB--\fR? \fIvarName\fR ?\fIdict\fR? \fIscript\fR
- .br
- .ti 7
- \fI$stmt\fR \fBclose\fR
- .ad b
- .BE
- .SH "DESCRIPTION"
- .PP
- Every database driver for TDBC (Tcl DataBase Connectivity) implements
- a \fIstatement\fR object that represents a SQL statement in a
- database. Instances of this object are created by executing the
- \fBprepare\fR or \fBpreparecall\fR object command on a database
- connection.
- .PP
- The \fBprepare\fR object command against the connection
- accepts arbitrary SQL code to be
- executed against the database. The SQL code may contain \fIbound
- variables\fR, which are strings of alphanumeric characters or
- underscores (the first character of the string may not be numeric),
- prefixed with a colon (\fB:\fR). If a bound variable appears in the
- SQL statement, and is not in a string set off by single or double
- quotes, nor in a comment introduced by \fB--\fR, it becomes a value
- that is substituted when the statement is executed. A bound variable
- becomes a single value (string or numeric) in the resulting
- statement. \fIDrivers are responsible for ensuring that the mechanism
- for binding variables prevents SQL injection.\fR
- .PP
- The \fBpreparecall\fR object command against the connection accepts a
- stylized statement in the form:
- .PP
- .CS
- \fIprocname\fR \fB(\fR?\fB:\fR\fIvarname\fR? ?\fB,:\fR\fIvarname\fR...?\fB)\fR
- .CE
- .PP
- or
- .PP
- .CS
- \fIvarname\fR \fB=\fR \fIprocname\fR \fB(\fR?\fB:\fR\fIvarname\fR? ?\fB,:\fR\fIvarname\fR...?\fB)\fR
- .CE
- .PP
- This statement represents a call to a stored procedure \fIprocname\fR in the
- database. The variable name to the left of the equal sign (if
- present), and all variable names that are parameters inside
- parentheses, become bound variables.
- .PP
- The \fBparams\fR method against a statement object enumerates the
- bound variables that appear in the statement. The result returned from
- the \fBparams\fR method is a dictionary whose keys are the names of
- bound variables (listed in the order in which the variables first
- appear in the statement), and whose values are dictionaries. The
- subdictionaries include at least the following keys (database drivers
- may add additional keys that are not in this list).
- .IP \fBdirection\fR
- Contains one of the keywords, \fBin\fR, \fBout\fR or \fBinout\fR
- according to whether the variable is an input to or output from the
- statement. Only stored procedure calls will have \fBout\fR or
- \fBinout\fR parameters.
- .IP \fBtype\fR
- Contains the data type of the column, and will generally be chosen
- from the set,
- \fBbigint\fR, \fBbinary\fR, \fBbit\fR, \fBchar\fR, \fBdate\fR,
- \fBdecimal\fR, \fBdouble\fR, \fBfloat\fR, \fBinteger\fR,
- \fBlongvarbinary\fR, \fBlongvarchar\fR, \fBnumeric\fR, \fBreal\fR,
- \fBtime\fR, \fBtimestamp\fR, \fBsmallint\fR, \fBtinyint\fR,
- \fBvarbinary\fR, and \fBvarchar\fR. (If the variable has a type that
- cannot be represented as one of the above, \fBtype\fR will contain
- a driver-dependent description of the type.)
- .IP \fBprecision\fR
- Contains the precision of the column in bits, decimal digits, or the
- width in characters, according to the type.
- .IP \fBscale\fR
- Contains the scale of the column (the number of digits after the radix
- point), for types that support the concept.
- .IP \fBnullable\fR
- Contains 1 if the column can contain NULL values, and 0 otherwise.
- .PP
- The \fBparamtype\fR object command allows the script to specify the
- type and direction of parameter transmission of a variable in a
- statement. (Some databases provide no method to determine this
- information automatically and place the burden on the caller to do
- so.) The \fIdirection\fR, \fItype\fR, \fIprecision\fR, \fIscale\fR,
- and \fInullable\fR arguments have the same meaning as the
- corresponding dictionary values in the \fBparams\fR object command.
- .PP
- The \fBexecute\fR object command executes the statement. Prior to
- executing the statement, values are provided for the bound variables
- that appear in it. If the \fIdict\fR parameter is supplied, it is
- searched for a key whose name matches the name of the bound
- variable. If the key is present, its value becomes the substituted
- variable. If not, the value of the substituted variable becomes a SQL
- NULL. If the \fIdict\fR parameter is \fInot\fR supplied, the
- \fBexecute\fR object command searches for a variable in the caller's
- scope whose name matches the name of the bound variable. If one is
- found, its value becomes the bound variable's value. If none is found,
- the bound variable is assigned a SQL NULL as its value. Once
- substitution is finished, the resulting statement is executed. The
- return value is a result set object (see \fBtdbc::resultset\fR for
- details).
- .PP
- The \fBresultsets\fR method returns a list of all the result sets that
- have been returned by executing the statement and have not yet been
- closed.
- .PP
- The \fBallrows\fR object command executes the statement as with the
- \fBexecute\fR object command, accepting an
- optional \fIdict\fR parameter giving bind variables. After executing
- the statement,
- it uses the \fIallrows\fR object command on the result set (see
- \fBtdbc::resultset\fR) to construct a list of the results. Finally,
- the result set is closed. The return value is the list of
- results.
- .PP
- The \fBforeach\fR object command executes the statement as with the
- \fBexecute\fR object command, accepting an
- optional \fIdict\fR parameter giving bind variables. After executing
- the statement,
- it uses the \fIforeach\fR object command on the result set (see
- \fBtdbc::resultset\fR) to evaluate the given \fIscript\fR for each row of
- the results. Finally, the result set is closed, even
- if the given \fIscript\fR results in a \fBreturn\fR, an error, or
- an unusual return code.
- .PP
- The \fBclose\fR object command removes a statement and any result sets
- that it has created. All system resources associated with the objects
- are freed.
- .SH "EXAMPLES"
- The following code would look up a telephone number in a directory,
- assuming an appropriate SQL schema:
- .PP
- .CS
- package require tdbc::sqlite3
- tdbc::sqlite3::connection create db phonebook.sqlite3
- set statement [db prepare {
- select phone_num from directory
- where first_name = :firstname and last_name = :lastname
- }]
- set firstname Fred
- set lastname Flintstone
- $statement foreach row {
- puts [dict get $row phone_num]
- }
- $statement close
- db close
- .CE
- .SH "SEE ALSO"
- encoding(n), tdbc(n), tdbc::connection(n), tdbc::resultset(n), tdbc::tokenize(n)
- .SH "KEYWORDS"
- TDBC, SQL, database, connectivity, connection, resultset, statement,
- bound variable, stored procedure, call
- .SH "COPYRIGHT"
- Copyright (c) 2008 by Kevin B. Kenny.
- '\" Local Variables:
- '\" mode: nroff
- '\" End:
- '\"
|