Oracle merge statement

See Advanced/Expert SQL,
See Exceptions in Pl/Sql
Merge over a single table with insert and/or update

merge into ORA_FILESYSTEM a using 
(
  select id from (
    select id from ORA_FILESYSTEM where de_mounted_on='culo' and id_host=201517
    union all 
    select null id from dual
  ) where rownum = 1
) t 
on (a.id=t.id)
--remove the following line to avoid updates
WHEN MATCHED THEN UPDATE SET a.n_kbytes=100 
WHEN NOT MATCHED THEN INSERT (a.id, a.de_Filesystem, a.n_kbytes, a.n_used, a.n_avail, a.perc_capacity, a.de_Mounted_on, a.id_host) 
  VALUES (1, 'mova', 1, 2, 3, 4, 'culo', 201517);

A clear example here:

CREATE TABLE TECH_MERGE_ACCOUNT
(
  ID_ACCOUNT  INTEGER,
  COGNOME     VARCHAR2(20 BYTE),
  BALANCE     NUMBER
)

 

CREATE TABLE TECH_MERGE_NEW_TRANSACTION
(
  ID_ACCOUNT  INTEGER,
  AMOUNT      NUMBER
)

 

INSERT INTO ALDO.TECH_MERGE_ACCOUNT (
ID_ACCOUNT, COGNOME, BALANCE)
VALUES ( 1, 'FADALTI', null);

INSERT INTO ALDO.TECH_MERGE_ACCOUNT (
ID_ACCOUNT, COGNOME, BALANCE)
VALUES ( 2, 'pippo', null);

INSERT INTO ALDO.TECH_MERGE_NEW_TRANSACTION (
ID_ACCOUNT, AMOUNT)
VALUES ( 1,100 );

INSERT INTO ALDO.TECH_MERGE_NEW_TRANSACTION (
ID_ACCOUNT, AMOUNT)
VALUES ( 2, 200);

INSERT INTO ALDO.TECH_MERGE_NEW_TRANSACTION (
ID_ACCOUNT, AMOUNT)
VALUES ( 3, 300);

 

MERGE INTO tech_merge_account a USING (
	  SELECT id_account, sum(amount) sum_amount FROM tech_merge_new_transaction GROUP BY id_account
) t 
ON (a.id_account=t.id_account) 
   WHEN MATCHED THEN UPDATE SET a.balance = nvl(a.balance, 0) + t.sum_amount 
   WHEN NOT MATCHED THEN INSERT (a.id_account,a.balance) VALUES (t.id_account,t.sum_amount);