Index: django/db/backends/oracle/base.py
===================================================================
--- django/db/backends/oracle/base.py	(revision 10175)
+++ django/db/backends/oracle/base.py	(working copy)
@@ -35,6 +35,14 @@
 IntegrityError = Database.IntegrityError
 
 
+# Check whether cx_Oracle was compiled with the WITH_UNICODE option.  This will
+# also be True in Python 3.0.
+if int(Database.version.split('.', 1)[0]) >= 5 and not hasattr(Database, 'UNICODE'):
+    convert_unicode = force_unicode
+else:
+    convert_unicode = smart_str
+
+
 class DatabaseFeatures(BaseDatabaseFeatures):
     empty_fetchmany_value = ()
     needs_datetime_string_cast = False
@@ -169,10 +177,10 @@
         return "RETURNING %s INTO %%s", (InsertIdVar(),)
 
     def savepoint_create_sql(self, sid):
-        return "SAVEPOINT " + self.quote_name(sid)
+        return convert_unicode("SAVEPOINT " + self.quote_name(sid))
 
     def savepoint_rollback_sql(self, sid):
-        return "ROLLBACK TO SAVEPOINT " + self.quote_name(sid)
+        return convert_unicode("ROLLBACK TO SAVEPOINT " + self.quote_name(sid))
 
     def sql_flush(self, style, tables, sequences):
         # Return a list of 'TRUNCATE x;', 'TRUNCATE y;',
@@ -302,7 +310,7 @@
     def _cursor(self):
         cursor = None
         if not self._valid_connection():
-            conn_string = self._connect_string()
+            conn_string = convert_unicode(self._connect_string())
             self.connection = Database.connect(conn_string, **self.settings_dict['DATABASE_OPTIONS'])
             cursor = FormatStylePlaceholderCursor(self.connection)
             # Set oracle date to ansi date format.  This only needs to execute
@@ -352,13 +360,14 @@
         if hasattr(param, 'bind_parameter'):
             self.smart_str = param.bind_parameter(cursor)
         else:
-            self.smart_str = smart_str(param, cursor.charset, strings_only)
+            self.smart_str = convert_unicode(param, cursor.charset,
+                                             strings_only)
         if hasattr(param, 'input_size'):
             # If parameter has `input_size` attribute, use that.
             self.input_size = param.input_size
         elif isinstance(param, basestring) and len(param) > 4000:
-            # Mark any string param greater than 4000 characters as an NCLOB.
-            self.input_size = Database.NCLOB
+            # Mark any string param greater than 4000 characters as a CLOB.
+            self.input_size = Database.CLOB
         else:
             self.input_size = None
 
@@ -420,7 +429,7 @@
         # is being passed to SQL*Plus.
         if query.endswith(';') or query.endswith('/'):
             query = query[:-1]
-        query = smart_str(query, self.charset) % tuple(args)
+        query = convert_unicode(query % tuple(args), self.charset)
         self._guess_input_sizes([params])
         try:
             return self.cursor.execute(query, self._param_generator(params))
@@ -442,7 +451,7 @@
         # is being passed to SQL*Plus.
         if query.endswith(';') or query.endswith('/'):
             query = query[:-1]
-        query = smart_str(query, self.charset) % tuple(args)
+        query = convert_unicode(query % tuple(args), self.charset)
         formatted = [self._format_params(i) for i in params]
         self._guess_input_sizes(formatted)
         try:
Index: tests/regressiontests/backends/tests.py
===================================================================
--- tests/regressiontests/backends/tests.py	(revision 10174)
+++ tests/regressiontests/backends/tests.py	(working copy)
@@ -4,7 +4,7 @@
 
 import unittest
 
-from django.db import connection
+from django.db import backend, connection
 from django.conf import settings
 
 
@@ -14,9 +14,10 @@
         # If the backend is Oracle, test that we can call a standard
         # stored procedure through our cursor wrapper.
         if settings.DATABASE_ENGINE == 'oracle':
+            convert_unicode = backend.convert_unicode
             cursor = connection.cursor()
-            cursor.callproc('DBMS_SESSION.SET_IDENTIFIER',
-                            ['_django_testing!',])
+            cursor.callproc(convert_unicode('DBMS_SESSION.SET_IDENTIFIER'),
+                            [convert_unicode('_django_testing!'),])
             return True
         else:
             return True
