lunedì 28 marzo 2022

Cancellazione (o Update) di record di una tabella in join con un'altra in MySql

DELETE T1 
FROM T1
        LEFT JOIN
    T2 ON T1.key = T2.key 
WHERE
    T2.key IS NULL


Una variante per l'update ha questa sintassi
UPDATE  T1 
        LEFT JOIN
    T2 ON T1.key = T2.key 
SET T1.campo=T2.campo
WHERE
    T2.key IS NULL

Questa variante permette di utilizzare la tabella T1 all'interno dell'eventuale subquery T2

esempio:
UPDATE T1 INNER JOIN
(SELECT CAMPO FROM T1 WHERE T1.CONDIZIONE ) T2 ON T1.KEY=T2.KEY
SET T1.CAMPO=T2.CAMPO
WHERE T1.CONDIZIONE

Thanks Elson Ferhati 

lunedì 21 marzo 2022

Allineamento fra valore Sequence e campo ID della tabella

Scenario :
  • Campo identity autoinc gestito con Trigger e Sequence 
  • Database Oracle versione inferiore alla 12 (perchè dalla 12 è gestito autonomamente come SqlServer)

Nei casi in cui in campo ID ( identificativo univoco ) venga inserito direttamente senza prelevare il campo dalla sequence o per qualche altro motivo ( nel mio caso ripristino delle tabelle e non delle sequence ), è necessario riportare il valore della sequence al massimo valore del campo autoinc +1.

La procedura sotto elencata fa questo lavoro.

DECLARE
  last_used  NUMBER;
  curr_seq   NUMBER;
BEGIN
  SELECT MAX(<CampoAutoInc>) INTO last_used FROM <Tabella>;
  LOOP
    SELECT <Sequence>.NEXTVAL INTO curr_seq FROM dual;
    IF curr_seq >= last_used THEN EXIT;
    END IF;
  END LOOP;
END;

Esempio

DECLARE
  last_used  NUMBER;
  curr_seq   NUMBER;
BEGIN
  SELECT MAX(IDN) INTO last_used FROM TESTAXML ;
  LOOP
    SELECT TESTAXML_SEQ.NEXTVAL INTO curr_seq FROM dual;
    IF curr_seq >= last_used THEN EXIT;
    END IF;
  END LOOP;
END;