From b48e0147ab03e267f01aa7270172905abe0867df Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 25 Aug 2012 20:08:52 +0000 Subject: - refine oracle returning some more to use purely positional approach --- lib/sqlalchemy/dialects/oracle/base.py | 31 ++++++++++++++++------------- lib/sqlalchemy/dialects/oracle/cx_oracle.py | 13 +++++------- 2 files changed, 22 insertions(+), 22 deletions(-) (limited to 'lib/sqlalchemy') diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index ff1b8043d..399f90035 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -501,20 +501,23 @@ class OracleCompiler(compiler.SQLCompiler): def returning_clause(self, stmt, returning_cols): - def create_out_param(col, i): - bindparam = sql.outparam("ret_%d" % i, type_=col.type) - self.binds[bindparam.key] = bindparam - return self.bindparam_string(self._truncate_bindparam(bindparam)) - - columnlist = list(expression._select_iterables(returning_cols)) - - columns = [ - self._label_select_column(None, c, True, False, {}, - within_columns_clause=False) - for c in columnlist - ] - - binds = [create_out_param(c, i) for i, c in enumerate(columnlist)] + columns = [] + binds = [] + for i, column in enumerate(expression._select_iterables(returning_cols)): + if column.type._has_column_expression: + col_expr = column.type.column_expression(column) + else: + col_expr = column + outparam = sql.outparam("ret_%d" % i, type_=column.type) + self.binds[outparam.key] = outparam + binds.append(self.bindparam_string(self._truncate_bindparam(outparam))) + columns.append(self.process(col_expr, within_columns_clause=False)) + self.result_map[outparam.key] = ( + outparam.key, + (column, getattr(column, 'name', None), + getattr(column, 'key', None)), + column.type + ) return 'RETURNING ' + ', '.join(columns) + " INTO " + ", ".join(binds) diff --git a/lib/sqlalchemy/dialects/oracle/cx_oracle.py b/lib/sqlalchemy/dialects/oracle/cx_oracle.py index ea1913c38..b6feb426a 100644 --- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py +++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py @@ -354,7 +354,7 @@ class OracleExecutionContext_cx_oracle(OracleExecutionContext): "Cannot create out parameter for parameter " "%r - it's type %r is not supported by" " cx_oracle" % - (bindparam.name, bindparam.type) + (bindparam.key, bindparam.type) ) name = self.compiled.bind_names[bindparam] self.out_parameters[name] = self.cursor.var(dbtype) @@ -443,13 +443,10 @@ class ReturningResultProxy(_result.FullyBufferedResultProxy): def _cursor_description(self): returning = self.context.compiled.returning - ret = [] - for c in returning: - if hasattr(c, 'name'): - ret.append((c.name, c.type)) - else: - ret.append((c.anon_label, c.type)) - return ret + return [ + ("ret_%d" % i, None) + for i, col in enumerate(returning) + ] def _buffer_rows(self): return collections.deque([tuple(self._returning_params["ret_%d" % i] -- cgit v1.2.1