def callproc(self, procname, args=()):
db = self._get_db()<EOL>if isinstance(procname, unicode):<EOL><INDENT>procname = procname.encode(db.encoding)<EOL><DEDENT>if args:<EOL><INDENT>fmt = b'<STR_LIT>' + procname + b'<STR_LIT>'<EOL>q = b'<STR_LIT>' % b'<STR_LIT:U+002C>'.join(fmt % (index, db.literal(arg))<EOL>for index, arg in enumerate(args))<EOL>self._query(q)<EOL>self.nextset()<EOL><DEDENT>q = b"<STR_LIT>" % (procname,<EOL>b'<STR_LIT:U+002C>'.join([b'<STR_LIT>' % (procname, i)<EOL>for i in range(len(args))]))<EOL>self._query(q)<EOL>return args<EOL>
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.