code: def callproc(self, procname, args=()):
          
          conn = self._get_db()
          if args:
              fmt = '@_{0}_%d=%s'.format(procname)
              self._query('SET %s' % ','.join(fmt % (index, conn.escape(arg))
                                              for index, arg in enumerate(args)))
              self.nextset()
  
          q = "CALL %s(%s)" % (procname,
                               ','.join(['@_%s_%d' % (procname, i)
                                         for i in range_type(len(args))]))
          self._query(q)
          self._executed = q
          return args
docs: 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.