When I started working with databases, one of the first things I learned was to put an ID column on pretty much every table, even if it's never displayed to the user. And I was always a bit miffed that Oracle doesn't provide any sort of automatic identity column support–in SQLServer, if you declare a column to be an identity, it automatically handles everything for you; every time you insert a new row, you get the next value in the sequence. To do the same thing in Oracle, you need to set it up yourself by creating a sequence and a “before insert” trigger. I felt like Oracle was almost encouraging bad behavior by making it harder than necessary to create an identity.
Then I started building packaged applications,some of which are built into APEX 4.2 and the new Oracle Cloud system. And I learned from those who know a lot more than I do that, while an auto-incrementing sequence is effective, it's actually not ideal; if you have data from two tables which you want to meld together (say you're replacing two separate systems with one unified one), you're going to have to use some sort of formula to transform the identity columns of one or the other so that they can live together–you can't have two records with an ID of 1. And there are other issues with sequences (I've posted before on the caching behavior creating gaps, and I've had to force SQLServer to change the start point for its identity columns on multiple occasions, for instance).
Turns out there's a better option (at least for Oracle). Rather than using a sequence, use the sys_guid() function. This creates a globally unique identifier every time you call the function–it's a 16 byte pseudo-random RAW value that's pretty much guaranteed to be unique. (Obviously, eventually you'd run out of values, same as with a sequence; but that's going to take a long time.) Since numbers are much better for ID columns than RAW values, we wrap the call to sys_guid in a to_number call, using the format mask to get the hexidecimal values for each byte. Put that in your “before insert” trigger, and you're done. No sequence necessary:
create or replace trigger [TRIGGER] before insert on [TABLE] for each row begin if :new.id is null then :new.id := to_number(sys_guid(),'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); end if; ... end;