Change a partitioned global non-unique index that is the primary key to a non-partitioned unique index
You can do this with DBMS_REDEFINITION, but you'll need double the space occupied by the table.

If I read your question correctly, this should do it:

[oracle@node1 ~]$ sqlplus phil/phil

SQL*Plus: Release 11.2.0.2.0 Production on Sun Jan 6 18:47:12 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL&gt; set echo on
SQL&gt; @part
SQL&gt;
SQL&gt; drop table PARTITIONED_INTERIM;

Table dropped.

SQL&gt;
SQL&gt; drop table partitioned;

Table dropped.

SQL&gt;
SQL&gt; create table partitioned
  2  (
  3  pk number,
  4  blah  varchar(40),
  5  blah2 varchar(40)
  6  )
  7  partition by range (pk)
  8  (partition p1 values less than (1000),
  9   partition p2 values less than (10000),
 10   partition p3 values less than (30000),
 11   partition p4 values less than (MAXVALUE)
 12   );

Table created.

SQL&gt;
SQL&gt; create index pk_idx
  2  on partitioned (pk)
  3  global partition by range (pk)
  4  (partition p1 values less than (1000),
  5   partition p2 values less than (10000),
  6   partition p3 values less than (30000),
  7   partition p4 values less than (MAXVALUE)
  8   )
  9  ;

Index created.

SQL&gt;
SQL&gt; ALTER TABLE partitioned ADD CONSTRAINT ppk PRIMARY KEY (pk) USING INDEX pk_idx;

Table altered.

SQL&gt;
SQL&gt; select index_name, uniqueness , table_name, partitioned
  2  from user_indexes
  3  where table_name = 'PARTITIONED';

INDEX_NAME                     UNIQUENES TABLE_NAME                     PAR
------------------------------ --------- ------------------------------ ---
PK_IDX                         NONUNIQUE PARTITIONED                    YES

SQL&gt;
SQL&gt; EXEC dbms_redefinition.can_redef_table('PHIL', 'PARTITIONED');

PL/SQL procedure successfully completed.

SQL&gt;
SQL&gt; create table PARTITIONED_INTERIM as ( select * from PARTITIONED where 1=0 );

Table created.

SQL&gt;
SQL&gt; exec DBMS_REDEFINITION.start_redef_table(uname =&gt;     'PHIL',orig_table =&gt; 'PARTITIONED',int_table =&gt; 'PARTITIONED_INTERIM');

PL/SQL procedure successfully completed.

SQL&gt;
SQL&gt; create unique index partitioned_interim_pk on partitioned_interim (pk) global online;

Index created.

SQL&gt;
SQL&gt; exec dbms_redefinition.sync_interim_table(uname =&gt; 'PHIL',orig_table =&gt; 'PARTITIONED',int_table =&gt; 'PARTITIONED_INTERIM');

PL/SQL procedure successfully completed.

SQL&gt;
SQL&gt; exec dbms_redefinition.finish_redef_table(uname =&gt; 'PHIL',orig_table =&gt; 'PARTITIONED',int_table =&gt; 'PARTITIONED_INTERIM');

PL/SQL procedure successfully completed.

SQL&gt;
SQL&gt; select index_name, uniqueness , table_name, partitioned
  2  from user_indexes
  3  where table_name = 'PARTITIONED';

INDEX_NAME                     UNIQUENES TABLE_NAME                     PAR
------------------------------ --------- ------------------------------ ---
PARTITIONED_INTERIM_PK         UNIQUE    PARTITIONED                    NO

SQL&gt;
SQL&gt;
SQL&gt;


Note that you'll have to deal with other indexes/objects etc too, using DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS() and DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT().