Merge upstream branch
diff --git a/system/database/drivers/oci8/oci8_driver.php b/system/database/drivers/oci8/oci8_driver.php
index 9047c21..a8b4109 100644
--- a/system/database/drivers/oci8/oci8_driver.php
+++ b/system/database/drivers/oci8/oci8_driver.php
@@ -586,7 +586,7 @@
 	 */
 	protected function _error_message()
 	{
-		$error = self::_get_error_data();
+		$error = $this->_oci8_error_data();
 		return $error['message'];
 	}
 
@@ -595,35 +595,39 @@
 	/**
 	 * The error message number
 	 *
-	 * @return	int
+	 * @return	string
 	 */
 	protected function _error_number()
 	{
-		$error = self::_get_error_data();
+		$error = $this->_oci8_error_data();
 		return $error['code'];
 	}
 
 	// --------------------------------------------------------------------
 
-	/* Get error data
+	/**
+	 * OCI8-specific method to get errors.
 	 *
-	 * Used by _error_message() and _error_number()
+	 * Used by _error_message() and _error_code().
 	 *
 	 * @return	array
 	 */
-	private function _get_error_data()
+	protected function _oci8_error_data()
 	{
-		$res = NULL;
-		foreach (array('curs_id', 'stmt_id', 'conn_id') as $key)
+		if (is_resource($this->curs_id))
 		{
-			if (is_resource($this->$key))
-			{
-				$res = $this->$key;
-				break;
-			}
+			return oci_error($this->curs_id);
+		}
+		elseif (is_resource($this->stmt_id))
+		{
+			return oci_error($this->stmt_id);
+		}
+		elseif (is_resource($this->conn_id))
+		{
+			return oci_error($this->conn_id);
 		}
 
-		return ( ! is_null($res)) ? oci_error($res) : oci_error();
+		return oci_error();
 	}
 
 	// --------------------------------------------------------------------
diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst
index 1260c26..c7d377b 100644
--- a/user_guide_src/source/changelog.rst
+++ b/user_guide_src/source/changelog.rst
@@ -128,8 +128,8 @@
 -  Fixed a bug in PDO's insert_id() method where it could've failed if it's used with Postgre versions prior to 8.1.
 -  Fixed a bug in CUBRID's affected_rows() method where a connection resource was passed to cubrid_affected_rows() instead of a result.
 -  Fixed a bug (#638) - db_set_charset() ignored its arguments and always used the configured charset and collation instead.
+-  Fixed a bug (#413) - Oracle's _error_message() and _error_number() methods used to only return connection-related errors.
 -  Fixed a bug in the Oracle (oci8) instance of :doc:`Database Forge Class <database/forge>` where create_table() would fail if used with AUTO_INCREMENT as it's not supported by Oracle.
--  Fixed a bug (#413) - The Oracle (oci8) database driver only used to return connection-related errors in _error_message() and _error_number().
 
 Version 2.1.1
 =============