mirror of
https://github.com/PyMySQL/mysqlclient.git
synced 2025-08-15 19:31:54 +08:00
Add callproc() support.
This commit is contained in:
@ -188,7 +188,43 @@ class BaseCursor(object):
|
|||||||
self._executed = query
|
self._executed = query
|
||||||
self._warning_check()
|
self._warning_check()
|
||||||
return r
|
return r
|
||||||
|
|
||||||
|
def callproc(self, procname, *args):
|
||||||
|
|
||||||
|
"""Execute stored procedure procname with args
|
||||||
|
|
||||||
|
procname -- string, name of procedure to execute on server
|
||||||
|
|
||||||
|
args -- Sequence of parameters to use with procedure
|
||||||
|
|
||||||
|
Returns the original args.
|
||||||
|
|
||||||
|
Compatibility warning: PEP-249 specifies that any modified
|
||||||
|
parameters must be returned. This is currently impossible
|
||||||
|
as they are only available by storing them in a server
|
||||||
|
variable and then retrieved by a query. Since stored
|
||||||
|
procedures return zero or more result sets, there is no
|
||||||
|
reliable way to get at OUT or INOUT parameters via callproc.
|
||||||
|
The server variables are named @_procname_n, where procname
|
||||||
|
is the parameter above and n is the position of the parameter
|
||||||
|
(from zero). Once all result sets generated by the procedure
|
||||||
|
have been fetched, you can issue a SELECT @_procname_0, ...
|
||||||
|
query using .execute() to get any OUT or INOUT values.
|
||||||
|
"""
|
||||||
|
|
||||||
|
db = self._get_db()
|
||||||
|
for index, arg in enumerate(args):
|
||||||
|
db.query("SET @_%s_%d=%s" % (procname, index,
|
||||||
|
db.literal(arg)))
|
||||||
|
q = "CALL %s(%s)" % (procname,
|
||||||
|
','.join(['@_%s_%d' % (procname, i)
|
||||||
|
for i in range(len(args))]))
|
||||||
|
if type(q) is UnicodeType:
|
||||||
|
q = q.encode(db.charset)
|
||||||
|
db.query(q)
|
||||||
|
self._do_get_result()
|
||||||
|
return args
|
||||||
|
|
||||||
def _do_query(self, q):
|
def _do_query(self, q):
|
||||||
from types import UnicodeType
|
from types import UnicodeType
|
||||||
db = self._get_db()
|
db = self._get_db()
|
||||||
|
Reference in New Issue
Block a user