Use a logical standby db to perform a rolling upgrade.
Databases must not be part of a DG broker configuration
DG protection mode must be MAXIMUM AVAILABILITY or PERFORMANCE
The COMPATIBLE init param must match the software release before the upgrade.

Create a  new or use a current logical standby.
Use an existing physical standby in 11g only.

Identify unsupported datatypes in a logical standby.
Query DBA_LOGSTDBY_UNSUPPORTED and DBA_LOGSTDBY_SKIP
If you can not prevent changes to unsupported tables during the upgrade you may be able to use Data Pump or ecp/imp to impport the tables to the upgraded database.
Unsupported transactions are recorded in the DBA_LOGSTDBY_EVENTS table on the logical standby db.

1) SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY; on the logical standby db.
SQL> Set the COMPATIBLE parameter.
2) Upgrade the db software on the logical standby
3) Execute DBMS_LOGSTDBY pl/sql proc on the standby to capture information on unsupported transactions on the primary db. Execute the following to capture and record the info as events in the DBA_LOGSTDBY_EVENTS table.
EXEC DBMS_LOGSTDBY.APPLY_SET (‘MAX_EVENTS_RECORDED’,DBMS_LOGSTDBY.MAX_EVENTS);
EXEC DBMS_LOGSTDBY.APPLY_SET (‘RECORD_UNSUPPORTED_OPERATIONS’,’TRUE’);
4)Restart sql apply on the standby
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
5)Query events to determine if there are any DDL or DML statements that were not applied on the logical standby.
SELECT EVENT_TIMESTAMP,  EVENT, STATUS FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIMESTAMP;
6)Switchover, on primary
ALTER DATABASE COMMIT TO SWITCHOVER TO LOGICAL STANDBY;
7)Complete the switchover, on logical standby
ALTER DATABASE COMMIT TO SWITCHOVERTO LOGICAL PRIMARY;
8) Upgrade the primary database
9) Start SQL apply on the primary
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE NEW PRIMARY db_link;
10) Monitor events on the new logical standby by querying DBA_LOGSTDBY_EVENTS
11) Perform a switchover to return to the original configuration
12 Raise the compatability parameter on both databases, do it on the standby before the primary.