def _do_array_ops(self): items = sorted(self.array_ops.items()) for (operation, row_schema), rows in items: r = list_values(rows) params = [] datatypes = [self.inputsizes[name] for name in row_schema.split()] for i, column in enumerate(zip(*r)): params.append(self.cursor.arrayvar(datatypes[i], list(column))) self.cursor.execute(operation, tuple(params))
def _do_inserts(self): # pylint:disable=too-many-locals def replace_var(match): name = match.group(1) new_name = '%s_%d' % (name, rownum) # pylint:disable=undefined-loop-variable if name in self.inputsizes: stmt_inputsizes[new_name] = self.inputsizes[name] params[new_name] = row[name] return ':%s' % new_name items = sorted(self.inserts.items()) for (_command, header, row_schema, _), rows in items: stmt_inputsizes = {} if len(rows) == 1: # use the single insert syntax row = list_values(rows)[0] stmt = "INSERT INTO %s VALUES (%s)" % (header, row_schema) for name in self.inputsizes: if name in row: stmt_inputsizes[name] = self.inputsizes[name] if stmt_inputsizes: self.cursor.setinputsizes(**stmt_inputsizes) self.cursor.execute(stmt, row) else: # use the multi-insert syntax parts = [] params = {} for rownum, row in enumerate(rows.values()): mod_row = oracle_rowvar_re.sub(replace_var, row_schema) parts.append("INTO %s VALUES (%s)" % (header, mod_row)) stmt = "INSERT ALL\n%s\nSELECT * FROM DUAL" % '\n'.join(parts) if stmt_inputsizes: self.cursor.setinputsizes(**stmt_inputsizes) self.cursor.execute(stmt, params)