1DBIx::Interp(3pm) User Contributed Perl Documentation DBIx::Interp(3pm)
2
3
4
6 DBIx::Interp - Interpolate Perl variables into SQL with DBI
7
9 use DBI;
10 use DBIx::Interp ':all';
11
12 my $dbx = DBIx::Interp->new($dbh);
13
14 my $rv = $dbx->do_i('INSERT INTO table', \%item);
15 my $rv = $dbx->do_i('UPDATE table SET', \%item, 'WHERE item_id <> ', \2);
16 my $rv = $dbx->do_i('DELETE FROM table WHERE item_id = ', \2);
17
18 my $LoH = $dbx->selectall_arrayref_i('
19 SELECT * FROM table WHERE x = ', \$s, 'AND y IN', \@v
20 ,attr(Slice=>{}));
21
23 DBIx::Interp brings SQL::Interp and DBI together in a natural way.
24 Please read the documentation of those two modules if you are
25 unfamiliar with them. The DBIx::Interp interface adds methods to the
26 DBI interface with an "_i" suffix, indicating that SQL::Interp
27 interpolatation is performed in these cases.
28
29 Note that this module is no longer used by the maintainer.
30 DBIx::Simple now features SQL::Interp integration and is the
31 recommended alternative.
32
34 "attr"
35 dbi_interp("SELECT * from my_table", attr( Slice => {} ) );
36
37 Creates and returns an DBIx::Interp::Attr object. When processed by
38 dbi_interp(), it will add the provided key/value pairs to the "%attrs"
39 hash that is accepted by many DBI methods.
40
41 "key_field"
42 $keyobj = key_field($key_field);
43
44 Creates and returns an DBIx::Interp::Key object. When processed by
45 dbi_interp(), an extra $key_field value will be returned in the result
46 so that the result is suitable for passing into $dbh->fetchrow_hashref
47 and related methods.
48
49 my ($sql, $key, $attr, @bind) =
50 my @params = dbi_interp "SELECT * FROM mytable", key_field('itemid');
51 $dbh->selectall_hashref(@params);
52
54 An object of type DBIx::Interp represents (and wraps) a database
55 handle. Most of its methods are wrappers around corresponding DBI
56 methods.
57
58 "new" (static method)
59 my $dbx = DBIx::Interp->new($db, %params);
60
61 Creates a new object, creating or attaching a DBI handle.
62
63 $db is either a DBI database handle or an ARRAYREF containing
64 parameters that will be passed to DBI::connect, e.g.
65 [$data_source, $username, $auth, \%attr]. This parameter may be
66 omitted.
67
68 Any additional %params are passed onto SQL::Interp::new.
69
70 "connect" (static method)
71 $dbx = DBIx::Interp->connect($data_source, $username, $auth, \%attr);
72
73 Connects to a database.
74
75 This is identical to DBI::connect except that it returns at
76 DBIx::Interp object. An alternate way to connect or attach an
77 existing DBI handle is via the "new" method.
78
79 "dbh"
80 $dbh = $dbx->dbh();
81
82 Returns the underlying DBI handle $dbh. The is useful if you need
83 to pass the DBI handle to code that does not use SQL::Interp.
84
85 $dbx->dbh()->selectall_arrayref(
86 "SELECT * FROM mytable WHERE x = ?", undef, $x);
87
88 "stx"
89 $stx = $dbx->stx();
90
91 Returns the underlying statement handle set $stx. (These are
92 discussed later.) Each DBIx::Interp object contains one statement
93 handle set for use on non-prepared database calls (e.g.
94 selectall_.*() methods).
95
96 $dbx->stx()->max_sths(10);
97
98 do_i
99 selectall_arrayref_i
100 selectall_hashref_i
101 selectcol_arrayref_i
102 selectrow_array_i
103 selectrow_arrayref_i
104 selectrow_hashref_i
105 These methods are identical to those in DBI except interpolation is
106 performed via SQL::Interp.
107
108 prepare
109 $stx = $dbx->prepare();
110
111 Creates a new statement handle set ($stx of type SQL::Interp::STX)
112 associated with $dbx. There are no parameters.
113
114 A statement handle set (stx) is an abstraction of a statement handle
115 and represents an entire set of statement handles for a given class of
116 SQL queries. This abstraction is used because a single interpolation
117 list may interpolate into any number of SQL queries (depending on
118 variable input), so multiple statement handles may need to be managed
119 and cached. Typically, you do not need to call "prepare" directly
120 because DBIx::Interp can transparently mangage a statement handle set
121 (see $dbx->stx()->max_sths(10)).
122
123 Up to one statement handle in a set is considered active. Other
124 operations performed on the statement handle set are passed to the
125 active statement handle so that the statement handle set often looks
126 and feels like a regular statement handle.
127
128 Statement handle set (STX) methods
129 These methods are for statement handle set objects.
130
131 "new"
132 $stx = SQL::Interp::STX->new($dbx);
133
134 Creates a new statement handle set. Typically this is not called
135 directly but rather is invoked through prepare().
136
137 "max_sths"
138 $max_sths = $stx->max_sths(); # get
139 $stx->max_sths($max_sths); # set
140
141 Gets or sets the maximum number of statement handles to cache in
142 the statement handle set. The default and minimum value is 1.
143
144 "sth"
145 $sth = $stx->sth();
146
147 Gets the current active statement handle (e.g. the only that was
148 just executed). Returns undef on none.
149
150 "sths"
151 $sths = $stx->sths();
152
153 Return a hashref of contained statement handles (map: $sql ->
154 $sth).
155
156 "execute"
157 $rv = $stx->execute(@list);
158
159 Executes the query in the given interpolation list against a
160 statement handle. If no statement matching statement handle
161 exists, a new one is prepared. The used statement handle is made
162 the active statement handle. Return on error behavior is similar
163 to DBI's execute.
164
165 @list is an interpolation list (suitable for passing to
166 dbi_interp()).
167
168 "fetch..."
169 $ary_ref = $stx->fetchrow_arrayref();
170
171 Various fetch.* methods analogous to those in DBIx::Interp are
172 available. The fetch will be performed against the active
173 statement handle in the set.
174
175 These are more advanced examples.
176
177 Binding variable types (DBI bind_param)
178 Compare this much simpler code to the example in SQL::Interp.
179
180 $dbx->selectall_arrayref(
181 "SELECT * FROM mytable WHERE",
182 "x=", \$x, "AND y=", sql_type(\$y, SQL_VARCHAR), "AND z IN",
183 sql_type([1, 2], SQL_INTEGER)
184 );
185
187 Philosophy and requirements
188 DBIx::Interp is designed to look an feel like DBI even when the DBI
189 interface is not entirely user friendly (e.g. the
190 (fetch|select)(all|row)?_(array|hash)(ref)? and do methods). Still,
191 the approach lowers the learning code and could simplify the process of
192 converting existing DBI code over to SQL::Interp.
193
194 The use of statement handle sets (STX) is not strictly necessary but is
195 rather designed to mimic DBI's statement handles more than anything
196 else. The DBX object itself contains a statement handle set, which can
197 be used for non-prepared calls such as to selectall_.*() methods (i.e.
198 cache statement handles like in DBIx::Simple's keep_statements).
199
200 $dbx->stx()->max_sths(2);
201 $dbx->do(...) for 1..5;
202 $dbx->do(...) for 1..5;
203
204 An ideal solution would probably be to integrate SQL::Interp into
205 DBIx::Simple rather than directly into DBI.
206
207 Proposed enhancements
208 The following enhancements to SQL::Interp have been proposed. The most
209 important suggestions are listed at top, and some suggestions could be
210 rejected.
211
212 DBI database handle and statement handle attributes are not currently
213 exposed from the wrapper except via $dbx->dbh()->{...}. Maybe a Tie
214 can be used. e.g. $dbx->{mysql_insert_id}
215
216 Support might be added for something analogous to DBI's
217 bind_param_inout.
218
219 DBI's bind_param_array is not currently supported. A syntax as follows
220 might be used:
221
222 "INSERT INTO mytable", [[...], [...], ...]
223
224 Passing identified variables:
225
226 my $x = {one => 'two'};
227 my $stx = $dbx->prepare("SELECT * FROM mytable WHERE", sql_type(\$x);
228 $stx->execute_vars();
229 ...
230 $x->{two} = 'three';
231 $stx->execute_vars();
232 ...
233
234 my $x = {one => 'two'};
235 my $y = {one => 'three', two => 'four'};
236 my $stx = $dbx->prepare("SELECT * FROM mytable WHERE", sql_type($x, 'x'));
237 $stx->execute_vars();
238 ...
239 $stx->execute_vars(sql_type($x, 'x'); # or?
240 $stx->execute_vars(x => $x); # or?
241 ...
242
244 David Manura (<http://math2.org/david>) (author). The existence and
245 original design of this module as a wrapper around DBI was suggested by
246 Jim Cromie.
247
249 Bug reports and comments on the design are most welcome. See the main
250 SQL::Interp module for details.
251
253 Copyright (c) 2004-2005, David Manura. This module is free software.
254 It may be used, redistributed and/or modified under the same terms as
255 Perl itself. See <http://www.perl.com/perl/misc/Artistic.html>.
256
258 Other modules in this distribution
259 SQL::Interp,
260
261 DBI.
262
263 Related modules: DBIx::Simple, SQL::Abstract, DBIx::Abstract,
264 Class::DBI, DBIx::Class, Rose::DB.
265
266
267
268perl v5.38.0 2023-07-21 DBIx::Interp(3pm)