martedì 21 gennaio 2025

RDBMS ORACLE - DDL MINUS - Genera uno script per verificare il contenuto di due tabelle

 Di seguito una query che genera la ddl per una minus tra due tabelle ed inserisce il contenuto in una tabella di appoggio.

SELECT 
  'INSERT INTO DM_ITI.APPO_COUNT_DIFF '||CHR(10)||MNS||CHR(10)||'COMMIT;' DDL_MINUS
FROM 
(SELECT 
   'SELECT COUNT(1) , '''||TAB||''' TAB_NAME FROM ('||CHR(10)|| MN ||');' AS MNS
 FROM
SELECT   LISTAGG(SEL_MINUS, chr(10)||' MINUS '||CHR(10)) 
                            WITHIN GROUP (ORDER BY COL_ORD) MN, TAB
     FROM
(SELECT 
  'SELECT '||LISTAGG(Column_Name,', ')  
    WITHIN GROUP (ORDER BY COLUMN_ID)||' FROM '|| OWNER ||'.'||TABLE_NAME SEL_MINUS,
       OWNER ||'.'||TABLE_NAME TAB,  1 COL_ORD
FROM
 (  SELECT Column_Name,Column_Id ,OWNER,TABLE_NAME,
         COUNT(column_id) OVER (PARTITION BY TABLE_NAME) CC, data_type
    FROM SYS.ALL_TAB_COLUMNS
    WHERE OWNER=UPPER('DM_ITI') AND table_name=UPPER('DIM_ARGOMENTO'
    ORDER BY 2)
GROUP BY OWNER,TABLE_NAME
   UNION ALL
 SELECT  
  'SELECT '||LISTAGG(Column_Name,',')  WITHIN GROUP (ORDER BY COLUMN_ID)||' FROM '||     OWNER ||'.'||TABLE_NAME||'@DB_LINK' AS  SEL_MINUS, OWNER ||'.'||TABLE_NAME TAB,
    2 COL_ORD
FROM
 ( SELECT Column_Name,Column_Id ,OWNER,TABLE_NAME,
        COUNT(column_id) OVER (PARTITION BY TABLE_NAME) CC, data_type
    FROM SYS.ALL_TAB_COLUMNS
    WHERE OWNER=UPPER('DM_ITI') AND table_name=UPPER('DIM_ARGOMENTO')
    ORDER BY 2)
GROUP BY OWNER,TABLE_NAME
)
GROUP BY TAB
));

Questa una volta eseguita genera il seguente statement sql:

INSERT INTO DM_ITI.APPO_COUNT_DIFF 
     SELECT COUNT(1) , 'DM_ITI.DIM_ARGOMENTO' TAB_NAME 
         FROM (
              SELECT TIPARGID, TIPARGDESCRIZIONE, TIPARGDATCAR 
                     FROM 
                           DM_ITI.DIM_ARGOMENTO
            MINUS 
              SELECT TIPARGID,TIPARGDESCRIZIONE,TIPARGDATCAR 
                   FROM    
                        DM_ITI.DIM_ARGOMENTO@DB_LINK);
COMMIT;

------------------------------------------------------------------------------------
Una volta eseguito lo statement sql avremo:



In questo caso le due tabelle sono identiche.

-----------------------------------------------------------------------------------

Di seguito la DDL della tabella in cui inserire le count:

  CREATE TABLE "DM_ITI"."APPO_COUNT_DIFF" 
   ( "CC_DIFF" NUMBER, 
"TAB_NAME" VARCHAR2(200 BYTE)
   ) ;

COMMENT ON COLUMN "DM_ITI"."APPO_COUNT_DIFF"."CC_DIFF" IS 'COUNT delle differenze = 0 Tabelle uguali >0 Tabelle differenti come contenuto';

COMMENT ON COLUMN "DM_ITI"."APPO_COUNT_DIFF"."TAB_NAME" IS 'Schema.Tabella indigata';





martedì 14 gennaio 2025

RDBMS ORACLE - Funzione SecondsSinceFromTimestamp IBM-DS Vs ORACLE


La funzione SecondsSinceFromTimestamp in IBM- DataStage:

 

SecondsSinceFromTimestamp(DATA_INIZIO_EVENTO, DATA_FINE_EVENTO)

 

effettua una differenza tra due timestamp in secondi.

Da documentazione IBM:




In oracle non esiste una funzione che effettua questa differenza, per cui occorre creare una funzione 
custom da richiamare. 

La funzione che è stata creata ha lo stesso nome di quella presente in  IBM-DS.

Da notare che la funzione presente in IBM - Datastage non effettua una differenza non tra END_DATE - START_DATE ma al contrario effettua una differenza tra la START_DATE - END_DATE per cui se consideriamo la differenza di un giorno tra start ed end avremo come risultato -86400, come indicato da documentazione IBM-DS.


Il valore come si vede è negativo -86400 secondi.

Se eseguiamo in oracle la funzione presente sotto avremo come risultato final -86400.


---------------------------------------------------------------------------------------------------------

create or replace  

FUNCTION SecondsSinceFromTimestamp

(start_time_in TIMESTAMP, end_time_in TIMESTAMP)RETURN NUMBER

AS

l_days NUMBER;

l_hours NUMBER;

l_minutes NUMBER;

l_seconds NUMBER;

sec_tot NUMBER;

BEGIN

SELECT 

  EXTRACT(DAY FROM start_time_in - end_time_in)

, EXTRACT(HOUR FROM start_time_in - end_time_in)

, EXTRACT(MINUTE FROM start_time_in - end_time_in)

, extract(SECOND FROM start_time_in - end_time_in)

INTO l_days, l_hours, l_minutes, l_seconds

FROM dual;

 

sec_tot := l_seconds + l_minutes*60 + l_hours*60*60 + l_days*24*60*60;

RETURN sec_tot;

END;

mercoledì 11 settembre 2024

RDBMS ORACLE - Statistiche di uno schema DB

 Di seguito alcuni comandi per raccogliere le statistiche di uno schema oracle:

  • DBMS_UTILITY.ANALYZE_SCHEMA --> viene utilizzato per raccogliere statistiche per tutte le tabelle, i cluster e gli indici di uno schema.
Examples:

  • EXEC DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','COMPUTE');

  • EXEC DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','ESTIMATE', estimate_rows => 1000);

  • EXEC DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','ESTIMATE', estimate_percent => 25);

  • EXEC DBMS_UTILITY.ANALYZE_SCHEMA('SCOTT','DELETE');

Note: È anche possibile analizzare l'intero database con il comando  DBMS_UTILITY.ANALYZE_DATABASE('COMPUTE'); 

oppure si può utilizzare DBMS_STATS.GATHER_TABLE_STATS

  • EXEC DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'CONTRACT', cascade =>true,estimate_percent => dbms_stats.auto_sample_size);

  • EXECUTE DBMS_STATS.GATHER_TABLE_STATS(ownname => 'CONTRACT', tabname => 'CONT_NAME', method_opt => 'FOR ALL COLUMNS', granularity => 'ALL', cascade => TRUE, degree => DBMS_STATS.DEFAULT_DEGREE);

il seguente script genererà l'elenco dei comandi per l'analisi di tutte le tabelle nello schema.

SELECT 'EXECUTE DBMS_STATS.GATHER_TABLE_STATS
 (ownname =>'||CHR(39)||'CONTRACT'||CHR(39)||', 
  tabname =>'||CHR(39)||TNAME||CHR(39)||', 
  method_opt => ''FOR ALL COLUMNS'', 
  granularity => ''ALL'', 
  cascade => TRUE, 
  degree => DBMS_STATS.DEFAULT_DEGREE);'
FROM TAB;

Terminando abbiamo la possibilità di utilizzare due metodi differenti per la raccolta delle statistiche. Per capire quale utilizzare si rimanda alla documentazione ORACLE:

  • DBMS_UTILITY.ANALYZE_SCHEMA
  • DBMS_STATS.GATHER_TABLE_STATS



lunedì 12 agosto 2024

SQL developer error with "disable modules and continue"

Nel caso in cui state utilizzando SQLDEVELOPER e ricevete un errore del tipo:

"Warning - could not install some modules: oracle.java_annotations - org.netbeans.InvalidException: Netigso: D:\sqldeveloper-4.0.2.15.21-no-jre\sqldeveloper\ide\lib\annotations.jar: Not found bundle:oracle.java_annotations oracle.ide_boot  ecc."

Allora occorre fare un pò di pulizia nella system_cache di sqldeveloper.

L'esempio di seguito è per UBUNTO.


Una volta cancellata la directory si può aprire nuovamente ODI.






venerdì 23 febbraio 2024

UBUNTU - How do I mount shared folders in Ubuntu using VMware

Per condividere una directory tra host e VM occorre prima accedere a vmware "Virtual Machine Settings" e spostarsi su "Options". 

In questo tab accedere a "Shared Folders" e configurare una directory di cui fare lo share. 

Lato Ubuntu una volta configurato vmware effettuare la configurazione del file fstab. Ma prima occorre configurare i tools di vmware su Ubuntu.

Eseguire il seguente comando per abilitare i tools:

  • sudo apt-get install open-vm-tools open-vm-tools-desktop
A questo punto accedere al file fstab ed aggiungere la stringa che permette la mount della directory presente sull'host.

  • sudo vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/sda3 during installation
UUID=dad2f2d1-2c0a-4e88-831c-67a122f0572c /               ext4    errors=remount-ro 0       1
# /boot/efi was on /dev/sda2 during installation
UUID=DA2B-A740  /boot/efi       vfat    umask=0077      0       1
/swapfile                                 none            swap    sw              0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto,exec,utf8 0       0

A questo punto aggiungere al termine del file la stringa che permette di effettuare la mount della directory host:

.host:/ORACLE_PROJECT    /mnt/hgfs/ORACLE_PROJECT/    fuse.vmhgfs-fuse    defaults,allow_other,uid=1000     0    0

Salvare il file e creare la directory indicata sopra:
  • cd /mnt/hgfs
  • mkdir ORACLE_PROJECT
A questo punto fare un test eseguendo il comando :
  • mount -a
Se tutto ok allora avremo effettuato correttamente la mount.

orcl1521@orcl1521-virtual-machine:~$ ll /mnt/hgfs
total 28
drwxr-xr-x 3 root     root  4096 feb 23 17:44 ./
drwxr-xr-x 3 root     root  4096 feb 19 17:12 ../
drwxrwxrwx 1 orcl1521 root 20480 feb 23 17:42 ORACLE_PROJECT/
orcl1521@orcl1521-virtual-machine:~$ ll /mnt/hgfs/ORACLE_PROJECT/
total 9308
drwxrwxrwx 1 orcl1521 root   20480 feb 23 17:42  ./
drwxr-xr-x 3 root     root    4096 feb 23 17:44  ../
drwxrwxrwx 1 orcl1521 root    4096 mag 11  2022  001_ORACLE_BASE_DBA_Scripts/
drwxrwxrwx 1 orcl1521 root    4096 gen 11  2023  02_WORKDAY/
-rwxrwxrwx 1 orcl1521 root  974608 feb 19 18:32  report_export1.xml*
-rwxrwxrwx 1 orcl1521 root  211773 feb 19 18:33  report_export2.xml*
-rwxrwxrwx 1 orcl1521 root   91339 feb 19 18:33  report_export3.xml*
-rwxrwxrwx 1 orcl1521 root  601587 feb 19 18:33  report_export4.xml*
-rwxrwxrwx 1 orcl1521 root  148404 feb 19 18:33  report_export5.xml*
-rwxrwxrwx 1 orcl1521 root  160672 feb 19 18:34  report_export6.xml*
-rwxrwxrwx 1 orcl1521 root  137419 gen 15  2019  report_export.xml*
drwxrwxrwx 1 orcl1521 root       0 mag 11  2022  SAP/
-rwxrwxrwx 1 orcl1521 root    3205 feb  1  2019  SEQ_INS_UPD_ANA_EDW_INV2*
-rwxrwxrwx 1 orcl1521 root  109350 apr 30  2019  seq.xml*
-rwxrwxrwx 1 orcl1521 root 3167755 feb 28  2017  SmartExport_PRJ_ODI_AEI_SVIL.xml*
drwxrwxrwx 1 orcl1521 root   12288 mag 11  2022  SOGEI/
drwxrwxrwx 1 orcl1521 root   12288 feb 16 14:05  sw/
drwxrwxrwx 1 orcl1521 root    4096 mag 11  2022  TEST_AEI/
drwxrwxrwx 1 orcl1521 root    4096 mag 11  2022  TEST_EOC/
-rwxrwxrwx 1 orcl1521 root  152302 mar 25  2019  Text1.txt*
-rwxrwxrwx 1 orcl1521 root    7143 mag 10  2019  Text2*
-rwxrwxrwx 1 orcl1521 root     228 apr 30  2019  Text3*