diff -r 913e3f48c05a lib/sqlalchemy/dialects/oracle/cx_oracle.py
--- a/lib/sqlalchemy/dialects/oracle/cx_oracle.py	Sun Feb 05 16:58:32 2012 -0500
+++ b/lib/sqlalchemy/dialects/oracle/cx_oracle.py	Mon Feb 06 10:58:44 2012 -0500
@@ -468,6 +468,7 @@
                 auto_convert_lobs=True, 
                 threaded=True, 
                 allow_twophase=True, 
+                coerce_to_decimal=True,
                 arraysize=50, **kwargs):
         OracleDialect.__init__(self, **kwargs)
         self.threaded = threaded
@@ -491,7 +492,12 @@
         self._cx_oracle_unicode_types = types("UNICODE", "NCLOB")
         self._cx_oracle_binary_types = types("BFILE", "CLOB", "NCLOB", "BLOB") 
         self.supports_unicode_binds = self.cx_oracle_ver >= (5, 0)
-        self.supports_native_decimal = self.cx_oracle_ver >= (5, 0)
+
+        self.supports_native_decimal = (
+                                        self.cx_oracle_ver >= (5, 0) and 
+                                        coerce_to_decimal
+                                    )
+
         self._cx_oracle_native_nvarchar = self.cx_oracle_ver >= (5, 0)
 
         if self.cx_oracle_ver is None:
@@ -603,7 +609,9 @@
                                     size, precision, scale):
             # convert all NUMBER with precision + positive scale to Decimal
             # this almost allows "native decimal" mode.
-            if defaultType == cx_Oracle.NUMBER and precision and scale > 0:
+            if self.supports_native_decimal and \
+                    defaultType == cx_Oracle.NUMBER and \
+                    precision and scale > 0:
                 return cursor.var(
                             cx_Oracle.STRING, 
                             255, 
@@ -614,7 +622,8 @@
             # make a decision based on each value received - the type 
             # may change from row to row (!).   This kills
             # off "native decimal" mode, handlers still needed.
-            elif defaultType == cx_Oracle.NUMBER \
+            elif self.supports_native_decimal and \
+                    defaultType == cx_Oracle.NUMBER \
                     and not precision and scale <= 0:
                 return cursor.var(
                             cx_Oracle.STRING, 
