Index: django/db/backends/oracle/base.py
===================================================================
--- django/db/backends/oracle/base.py	(revision 5790)
+++ django/db/backends/oracle/base.py	(working copy)
@@ -30,6 +30,11 @@
     # Import copy of _thread_local.py from Python 2.4
     from django.utils._threading_local import local
 
+try:
+    reversed
+except NameError:
+    from django.utils.itercompat import reversed   # Python 2.3 fallback
+
 class DatabaseWrapper(local):
     def __init__(self, **kwargs):
         self.connection = None
@@ -183,7 +188,7 @@
 
 def get_limit_offset_sql(limit, offset=None):
     # Limits and offset are too complicated to be handled here.
-    # Instead, they are handled in django/db/backends/oracle/query.py.
+    # Instead, they are handled in the OracleQuerySet class.
     return ""
 
 def get_random_function_sql():
@@ -310,7 +315,7 @@
 
     class OracleQuerySet(DefaultQuerySet):
 
-        def iterator(self):
+        def _iterator(self):
             "Performs the SELECT database lookup of this QuerySet."
 
             from django.db.models.query import get_cached_row
@@ -328,6 +333,8 @@
                     select, sql, params = self._get_sql_clause()
             except EmptyResultSet:
                 raise StopIteration
+            if self._limit == 0:
+                raise StopIteration
             if not full_query:
                 full_query = "SELECT %s%s\n%s" % \
                              ((self._distinct and "DISTINCT " or ""),
@@ -405,11 +412,7 @@
 
             # ORDER BY clause
             order_by = []
-            if self._order_by is not None:
-                ordering_to_use = self._order_by
-            else:
-                ordering_to_use = opts.ordering
-            for f in handle_legacy_orderlist(ordering_to_use):
+            for f in handle_legacy_orderlist(self._get_ordering()):
                 if f == '?': # Special case.
                     order_by.append(backend.get_random_function_sql())
                 else:
@@ -452,14 +455,10 @@
                 order_by_clause = " OVER (ORDER BY %s )" % (", ".join(order_by))
             else:
                 #Oracle's row_number() function always requires an order-by clause.
-                #So we need to define a default order-by, since none was provided.
-                order_by_clause = " OVER (ORDER BY %s.%s)" % \
-                    (backend.quote_name(opts.db_table),
-                    backend.quote_name(opts.fields[0].db_column or opts.fields[0].column))
-            # limit_and_offset_clause
-            if self._limit is None:
-                assert self._offset is None, "'offset' is not allowed without 'limit'"
+                #So we need to define a stable order-by, since none was provided.
+                order_by_clause = " OVER (ORDER BY 1)"
 
+            # limit_and_offset_clause
             if self._offset is not None:
                 offset = int(self._offset)
             else:
