Index: django/db/models/sql/where.py
===================================================================
--- django/db/models/sql/where.py	(revision 7441)
+++ django/db/models/sql/where.py	(working copy)
@@ -140,7 +140,7 @@
         elif lookup_type == 'search':
             return (connection.ops.fulltext_search_sql(field_sql), params)
         elif lookup_type in ('regex', 'iregex'):
-            return connection.ops.regex_lookup % (field_sql, cast_sql), params
+            return connection.ops.regex_lookup(lookup_type) % (field_sql, cast_sql), params
 
         raise TypeError('Invalid lookup_type: %r' % lookup_type)
 
Index: django/db/backends/oracle/base.py
===================================================================
--- django/db/backends/oracle/base.py	(revision 7441)
+++ django/db/backends/oracle/base.py	(working copy)
@@ -119,11 +119,18 @@
 
     def regex_lookup_10(self, lookup_type):
         if lookup_type == 'regex':
-            match_option = 'c'
+            match_option = "'c'"
         else:
-            match_option = 'i'
-        return 'REGEXP_LIKE(%%s %%s %s)' % match_option
+            match_option = "'i'"
+        return 'REGEXP_LIKE(%%s, %%s, %s)' % match_option
 
+    def regex_lookup(self, lookup_type):
+        # If regex_lookup is called before it's been initialized, then create
+        # a cursor to initialize it and recur.
+        from django.db import connection
+        connection.cursor()
+        return connection.ops.regex_lookup(lookup_type)
+
     def sql_flush(self, style, tables, sequences):
         # Return a list of 'TRUNCATE x;', 'TRUNCATE y;',
         # 'TRUNCATE z;'... style SQL statements
