'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.
Compatibility warning: The act of calling a stored procedure
itself creates an empty result set. This appears after any
result sets generated by the procedure. This is non-standard
behavior with respect to the DB-API. Be sure to use nextset()
to advance through all result sets; otherwise you may get
disconnected.'

def callproc(self, procname, args=()):

    db = self._get_db()
    for (index, arg) in enumerate(args):
        q = ('SET    @_%s_%d=%s' % (procname, index, db.literal(arg)))
        if isinstance(q, unicode):
            q = q.encode(db.unicode_literal.charset)
        self._query(q)
        self.nextset()
    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.unicode_literal.charset)
    self._query(q)
    self._executed = q
    if (not self._defer_warnings):
        self._warning_check()
    return args
