venerdì 22 dicembre 2023

RDBMS ORACLE - Come leggere un campo LONG

 Di seguito un semplice esempio di come leggere un campo LONG.

desc dba_views;

Nome             Nullo?   Tipo                

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

OWNER            NOT NULL VARCHAR2(128)       

VIEW_NAME        NOT NULL VARCHAR2(128)       

TEXT_LENGTH               NUMBER              

TEXT                      LONG                

TEXT_VC                   VARCHAR2(4000 CHAR) 

TYPE_TEXT_LENGTH          NUMBER              

TYPE_TEXT                 VARCHAR2(4000)      

OID_TEXT_LENGTH           NUMBER              

OID_TEXT                  VARCHAR2(4000)      

VIEW_TYPE_OWNER           VARCHAR2(128)       

VIEW_TYPE                 VARCHAR2(128)       

SUPERVIEW_NAME            VARCHAR2(128)       

EDITIONING_VIEW           VARCHAR2(1 CHAR)    

READ_ONLY                 VARCHAR2(1 CHAR)    

CONTAINER_DATA            VARCHAR2(1 CHAR)    

BEQUEATH                  VARCHAR2(12 CHAR)   

ORIGIN_CON_ID             NUMBER 


create table IA_INTEGRATION.gr_views

(owner VARCHAR2(128),

 view_name VARCHAR2(128),

 text clob );


DESC IA_INTEGRATION.gr_views;

Nome      Nullo? Tipo          

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

OWNER            VARCHAR2(128) 

VIEW_NAME        VARCHAR2(128) 

TEXT             CLOB  


insert into IA_INTEGRATION.gr_views 

     select owner,view_name,to_lob(text) 

       from dba_views

       where owner='IA_INTEGRATION';

COMMIT;


SELECT COUNT(1) FROM IA_INTEGRATION.gr_views;

  COUNT(1)

----------

        12


select COUNT(1) 

  from IA_INTEGRATION.gr_views 

    where text like ('%SELECT%');

  COUNT(1)

----------

        12





lunedì 24 luglio 2023

ODI 12c - How to Program Conditional Clauses Using ODI Substitution Methods

Come rendere una procedura ODI dinamica durante la chiamata da parte dell'Agent.Supponiamo di dover effettuare la insert in una tabella leggendo una select che occorre comporre in maniera dinamica ad ogni chiamata a seconda del valore di input. Il che vuol dire che se io ho in input ad esempio un valore leggo dalla tabella A altrimenti leggo dalla tabella B e cosi' via.

How to make an ODI procedure dynamic during the call by the Agent. Suppose we have to insert into a table by reading a select that must be composed dynamically at each call according to the input value. Which means that if I have a value as input, for example, I read from table A, otherwise I read from table B and so on.

INSERT INTO <....>

if valore di input A1 then

SELECT A1 FROM A1

if valore di input A2 then

SELECT A1 FROM A2 

...

if valore di input An-1 then

SELECT A1 FROM An-1

if valore di input An then

SELECT A1 FROM An;

O magari vogliamo rendere un pezzo di una procedura dinamico in base a quanto viene fornito in input. Per ottenere quanto indicato sopra possiamo ad esempio procedere nei seguenti modi:

Or maybe we want to make a piece of a procedure dynamic based on what is provided as input. To obtain the above we can for example proceed in the following ways:

INSERT INTO TEST1  (    JOB_ID,    CRMT_CAPDATE,    CRMT_INSDATE  )

<$

 if  (#PROJECT.JOB_ID == 1) {$> SELECT '1' JOB_ID, SYSTIMESTAMP CRMT_CAPDATE, SYSTIMESTAMP CRMT_INSDATE FROM A1 <$}

 else if  (#PROJECT.JOB_ID == 2) {$> SELECT '2' JOB_ID, SYSTIMESTAMP CRMT_CAPDATE, SYSTIMESTAMP CRMT_INSDATE FROM A2 <$}

 else if  (#PROJECT.JOB_ID == 3) {$> SELECT '3' JOB_ID, SYSTIMESTAMP CRMT_CAPDATE, SYSTIMESTAMP CRMT_INSDATE FROM A3 <$}

 else if  (#PROJECT.JOB_ID == 4) {$> SELECT '4' JOB_ID, SYSTIMESTAMP CRMT_CAPDATE, SYSTIMESTAMP CRMT_INSDATE FROM A4 <$}

 $>     

In questo caso a seconda del valore assunto dalla variabile JOB_ID viene eseguita una ed una sola delle select presenti. Avremo quindi in fase di execution la seguente sostituzione nel caso in cui in input ricevessimo JOB_ID=1: 

In this case, depending on the value assumed by the JOB_ID variable, one and only one of the selects present is performed. We will therefore have the following substitution in the execution phase if we receive JOB_ID=1 as input:

INSERT INTO TEST1  (JOB_ID,ODI_STEP,ODI_NAME) SELECT '1' JOB_ID, SYSTIMESTAMP CRMT_CAPDATE, SYSTIMESTAMP CRMT_INSDATE FROM A1      

Altro modo di scrivere quanto indicato sopra, nel caso in cui input abbiamo un varchar e non un number è il seguente, invece di utilizzare la doppia uguaglianza "==" si può utilizzare il richiamo di una funzione ODI:

INSERT INTO TEST1  (    JOB_ID,    CRMT_CAPDATE,    CRMT_INSDATE  )

<@ 

if  ("#JOB_ID".equals("A1") {@> 

SELECT '1' JOB_ID, CRMT_CAPDATE, CRMT_INSDATE  FROM A1 <@}

else if  ("#JOB_ID".equals("A2") {@> 

SELECT '1' JOB_ID, CRMT_CAPDATE, CRMT_INSDATE  FROM A2 <@}

else if  ("#JOB_ID".equals("A3") {@> 

SELECT '1' JOB_ID, CRMT_CAPDATE, CRMT_INSDATE  FROM A3 <@}

else if  ("#JOB_ID".equals("A4") {@> 

SELECT '1' JOB_ID, CRMT_CAPDATE, CRMT_INSDATE  FROM A4 <@}

 @>     


Di seguito la nota del supporto che spiega il meccanismo di scambio:

Below is the support note explaining the swap mechanism:

· How to Program Conditional Clauses Using ODI Substitution Methods ? (Doc ID 424038.1)











venerdì 16 giugno 2023

RDBMS ORACLE - Query di analisi dello spazio occupato

 Di seguito alcune query per l'analisi dello spazio occupato da un DB oracle, basate sull'analisi dei datafile/tablespace e tabelle AWM.

  • CRESCITA DATABASE BASATO SU DATAFILE

SELECT
(select min(creation_time) from v$datafile) ""Create Time"",
(select name from v$database) ""Database Name"",
ROUND((SUM(USED.BYTES) / 1024 / 1024 ),2) ""Database Size MB"",
ROUND((SUM(USED.BYTES) / 1024 / 1024 ) - ROUND(FREE.P / 1024 / 1024 ),2) ""Used Space MB"",
ROUND(((SUM(USED.BYTES) / 1024 / 1024 ) - (FREE.P / 1024 / 1024 )) / ROUND(SUM(USED.BYTES) / 1024 / 1024 ,2)*100,2) ""Used in % MB"",
ROUND((FREE.P / 1024 / 1024 ),2) ""Free Space MB"",
ROUND(((SUM(USED.BYTES) / 1024 / 1024 ) - ((SUM(USED.BYTES) / 1024 / 1024 ) - ROUND(FREE.P / 1024 / 1024 )))/ROUND(SUM(USED.BYTES) / 1024 / 1024,2 )*100,2) ""Free in % MB"",
ROUND(((SUM(USED.BYTES) / 1024 / 1024 ) - (FREE.P / 1024 / 1024 ))/(select sysdate-min(creation_time) from v$datafile),2)  ""Growth DAY MB"",
ROUND(((SUM(USED.BYTES) / 1024 / 1024 ) - (FREE.P / 1024 / 1024 ))/(select sysdate-min(creation_time) from v$datafile)/ROUND((SUM(USED.BYTES) / 1024 / 1024 ),2)*100,3)  ""Growth DAY in % MB"",
ROUND(((SUM(USED.BYTES) / 1024 / 1024 ) - (FREE.P / 1024 / 1024 ))/(select sysdate-min(creation_time) from v$datafile)*7,2) ""Growth WEEK MB"",
ROUND((((SUM(USED.BYTES) / 1024 / 1024 ) - (FREE.P / 1024 / 1024 ))/(select sysdate-min(creation_time) from v$datafile)/ROUND((SUM(USED.BYTES) / 1024 / 1024 ),2)*100)*7,3) ""Growth WEEK in MB""
FROM    (SELECT BYTES FROM gV$DATAFILE
UNION ALL
SELECT BYTES FROM gV$TEMPFILE
UNION ALL
SELECT BYTES FROM gV$LOG) USED,
(SELECT SUM(BYTES) AS P FROM DBA_FREE_SPACE) FREE
GROUP BY FREE.P;

  • DATABASE CRESCITA DAY-WEEK
SELECT MIN(creation_time) Create_Time,  ts.name,
  ROUND(SUM(df.bytes)  /1024/1024) curr_size_MB,
  ROUND( (SUM(df.bytes)/1024/1024)/ROUND(sysdate-MIN(creation_time)),1) growth_per_day_MB,
  ROUND( (SUM(df.bytes)/1024/1024)/ROUND(sysdate-MIN(creation_time)) * 7,1) growth_7_days_MB
FROM v$datafile df ,  v$tablespace ts
WHERE df.ts#=ts.ts#
GROUP BY df.ts#,  ts.name
ORDER BY df.ts#

  • DATABASE CRESCITA - TABLESPACE PER MESE
select v.TS#,d.tablespace_name, 
       v.status ""Status"" ,to_char(creation_time, 'MM-YYYY') ""Month"", 
       ROUND(sum(v.bytes)/1024/1024/1024,3) ""Growth in GB""
FROM v$datafile v, dba_data_files d
where creation_time >to_date('2000','YYYY')
     and d.file_name = v.name
group by TS#,d.tablespace_name, 
         v.status,to_char(creation_time, 'MM-YYYY')
order by  TS#,d.tablespace_name, 
          v.status,to_char(creation_time, 'MM-YYYY')

  • DATABASE CRESCITA - AWR - SNAP_ID - SNAP_TIME
SELECT   A.sNAP_ID,A.SNAP_TIME,
     A.ProgSum/1024/1024 ProgSum,( ((c.bb-b.sad) + a.ProgSum)/(1024*1024)) MB
              from
              ( select a.snap_id,
                  SNAP_TIME,
                  sum(TOTAL_SPACE_ALLOCATED_DELTA) over ( order by a.SNAP_ID) ProgSum
              from
                  (select SNAP_ID,
                      sum(SPACE_ALLOCATED_DELTA) TOTAL_SPACE_ALLOCATED_DELTA
                  from DBA_HIST_SEG_STAT
                  group by SNAP_ID
                  having sum(SPACE_ALLOCATED_TOTAL) <> 0
                  order by 1 ) a,
                  (select distinct SNAP_ID,
                      to_char(END_INTERVAL_TIME,'DD-Mon-YYYY HH24:Mi') SNAP_TIME
                  from DBA_HIST_SNAPSHOT) b
              where a.snap_id=b.snap_id ) A,
              (select sum(SPACE_ALLOCATED_DELTA) sad from DBA_HIST_SEG_STAT) B,
              (select sum(bytes) bb from dba_segments) C
order by 1,2


  • DATABASE - MIN/MAX SPAZIO UTILIZZATO TRA 2 SNAP_ID
with snaps as (select min(snap_id) min_snap, max(snap_id) max_snap 
 from dba_hist_snapshot 
 where begin_interval_time > ADD_MONTHS(sysdate,-2))
select
  O.TABLESPACE_NAME,
  O.OWNER||'.'||O.OBJECT_NAME SCHEMA_OBJECT_NAME,
  o.object_type,
  min(SNAP_ID) MIN_OBJ_SNAP_id,
  max(SNAP_ID) max_obj_snap_id,
  ROUND(MIN(H.SPACE_USED_TOTAL)/1024/1024/1024,3) min_space_used_GB, 
  ROUND(SUM(H.SPACE_USED_DELTA)/1024/1024/1024,3) SPACE_USED_GB, 
  ROUND(SUM(H.SPACE_ALLOCATED_DELTA)/1024/1024/1024,3) space_alloc_GB
from
  DBA_HIST_SEG_STAT H join dba_hist_seg_stat_obj o 
  on h.dbid=o.dbid and h.ts#=o.ts# and h.obj#=o.obj# and h.dataobj#=o.dataobj#
WHERE 1=1
  AND H.SNAP_ID BETWEEN (SELECT MIN_SNAP FROM SNAPS) AND (SELECT MAX_SNAP FROM SNAPS)
  and H.DBID = (select DBID from V$DATABASE)
  and H.INSTANCE_NUMBER = (select INSTANCE_NUMBER from V$INSTANCE)
  and O.OWNER != '** MISSING **' -- segments already gone
  and O.OBJECT_NAME not like 'BIN$%' -- recycle-bin
  and O.OBJECT_NAME not like 'SYS_%' -- LOBs, etc - not too representative
  AND o.OWNER NOT IN ('APEX_030200','SCOTT','OWBSYS','PERFSTAT',
  'FLOWS_FILES','PUBLIC','SYS','SYSTEM','OUTLN','DIP','DBSNMP','WMSYS', 
  'EXFSYS','DMSYS','CTXSYS','XDB','ANONYMOUS','ORDSYS','ORDPLUGINS','SI_INFORMTN_SCHEMA',
  'MDSYS','OLAPSYS','MDDATA','SYSMAN','MGMT_VIEW','VIP')
group by
  O.TABLESPACE_NAME,O.OWNER||'.'||O.OBJECT_NAME,o.OBJECT_TYPE
having SUM(H.SPACE_ALLOCATED_DELTA)>0