Oracle: como UPSERT (atualizar ou inserir em uma tabela?)

A operação UPSERT atualiza ou insere uma linha em uma tabela, dependendo se a tabela já tiver uma linha que corresponda aos dados:

if table t has a row exists that has key X:
    update t set mystuff... where mykey=X
else
    insert into t mystuff...

Como a Oracle não possui uma declaração UPSERT específica, qual é a melhor maneira de fazer isso?