Posts

Es werden Posts vom 2019 angezeigt.

Dropping Columns

Oracle 8i introduced the ability to drop a column from a table. Prior to this it was necessary to drop the entire table and rebuild it. Now you can mark a column as unused (logical delete) or delete it completely (physical delete). Logical Delete On large tables the process of physically removing a column can be very time and resource consuming. For this reason you may decide to logically delete it.   ALTER TABLE table_name SET UNUSED (column_name);  ALTER TABLE table_name SET UNUSED (column_name1, column_name2); Once this is done the columns will no longer be visible to the user. If at a later date you have time to physically delete the columns this can be done using the following.   ALTER TABLE table_name DROP UNUSED COLUMNS; On large tables you can reduce the amount of undo logs accumulated by using the CHECKPOINT option which forces a checkpoint after the specified number of rows have been processed.   ALTER TABLE table_name DROP UNUSED COLUMNS CHECKPOINT 250;

Firefox - Zugriff auf lokale Dateien erlauben

Um mit dem Firebox Browser auf lokale Dateien zugreifen zu können, ist folgende Property zu setzen: capability.policy.localfilelinks_policy.sites Beispiele: file:///Q:/Projekte/Test.pdf file://///abc/fs/Projekte/Test.pdf

ODI: IKM Optionen per Choice auswählen

Bild
Optionen eines IKM können per Choice mit verschiedenen Werten hinterlegt werden. Diese werden in der Spalte "Default Value" eingetragen. Nach Auswahl des "Type" Choice öffnet sich bei Klick auf "Default Value" ein Dialog zum Anlegen und Bearbeiten der Auswahleinträge. Quelle: https://blogs.oracle.com/dataintegration/odi-12c-improving-usability-of-km-recipes

Incremental Statistics on Partitioned Objects

Ab Oracle 12.2 können die Statistiken z.B. partitionierter Tabellen "inkrementel" erstellt werden. Dadurch entfällt z.B. in DWH-Umgebungen der sehr aufwändige Full-Table-Scan nachdem nur eine Partition geladen wurde. Um incremental statistics nutzen zu können, muss dieses für die Tabelle eingeschaltet werden: Einstellungen prüfen: select     DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT', 'HM19_STAGE', 'I_OKV_FALL_FZ') ESTIMATE_PERCENT   , DBMS_STATS.GET_PREFS('GRANULARITY', 'HM19_STAGE', 'I_OKV_FALL_FZ') GRANULARITY   , DBMS_STATS.GET_PREFS('INCREMENTAL', 'HM19_STAGE', 'I_OKV_FALL_FZ') INCREMENTAL   , DBMS_STATS.GET_PREFS('INCREMENTAL_LEVEL', 'HM19_STAGE', 'I_OKV_FALL_FZ') INCREMENTAL_LEVEL   , DBMS_STATS.GET_PREFS('PUBLISH', 'HM19_STAGE', 'I_OKV_FALL_FZ') PUBLISH   , DBMS_STATS.GET_PREFS('APPROXIMATE_NDV_ALGORITHM', 'HM19_STAGE', 'I_OKV_

SQL: Abfrage Tabellen mit Spaltenliste, Datentypen und Kommentaren

kleine Abfrage zu Tabellen und Spalten (inkl. Datentypen und Kommentare): select TC.TABLE_NAME      , TC.COLUMN_NAME      , TC.DATA_TYPE      , TC.DATA_LENGTH      , COC.COMMENTS      , TC.COLUMN_ID   from USER_TAB_COLS TC   join USER_COL_COMMENTS COC on TC.TABLE_NAME = COC.TABLE_NAME and TC.COLUMN_NAME = COC.COLUMN_NAME  where TC.TABLE_NAME in ('D_1', 'D_2', 'D_3') union all select TABLE_NAME      , null      , null      , null      , COMMENTS      , 0   from USER_TAB_COMMENTS  where TABLE_NAME in ('D_1', 'D_2', 'D_3')  order by TABLE_NAME, COLUMN_ID ;

APEX-User im Logging mitschreiben

Um aus der Session des aktuellen APEX-User abzugreifen gibt es folgende sys_context abfragen: -- Apex-User abfragen select sys_context('APEX$SESSION', 'APP_USER') from dual; -- DB-Umgebung abfragen select substr(SYS_CONTEXT ('USERENV', 'DB_NAME'),-1) UMGEBUNG from dual; Weitere Möglichkeiten (mindestens ab APEX 19.1): sys_context('APEX$SESSION', 'APP_USER') sys_context('APEX$SESSION', 'APP_ID') sys_context('APEX$SESSION', 'WORKSPACE_ID')   sys_context('APEX$SESSION', 'APP_SESSION')   Ergänzend noch die bekannten Klassiker: SYS_CONTEXT ('USERENV', 'SESSION_USER') SYS_CONTEXT ('USERENV', 'OS_USER') SYS_CONTEXT ('USERENV', 'DB_NAME')

APEX auto refresh region

Um auf einer APEX-Seite eine Region (z.B. classic report) in regelmäßigen Abständen zu aktualisieren, sind folgende zwei Schritte nötig: 1) beim Report unter Advanced / StaticID - eine Static-ID vergeben, im Bsp: P2_ODI_MONITOR 2) etwas weiter unten unter Header and Footer / Header Text folgenden JS-Snip eintragen: &ltscript type="text/javascript"&gt setInterval("$('#P2_ODI_MONITOR').trigger('apexrefresh');", 5000); &lt/script&gt

Oracle: Sequence einstellen

Soll eine bestehende Sequence auf einen bestimmten Wert gesetzt werden, geht dies nur mit folgenden drei Schritten: -- Modify the last number alter sequence SEQ_A increment by 4480974 nocache ; select SEQ_A .nextval from dual; alter sequence SEQ_A increment by 1 cache 20 ;

ODI - eigene Einstellungen

Nacharbeiten In der odi.conf ( \odi\studio\bin) folgende Zeilen am Ende hinzufügen: AddVMOption -Duser.language=en AddVMOption -Duser.region=US AddVMOption -Dhttp.nonProxyHosts= svn.kvb.de Exkurs: Oracle SQL Developer Data Modeler 4.1.5 Liegt zur Installation hier: Q:\OE\BER-IT\GAB\DWH\Tools\Data Modeler In der datamodeler.conf ( \ datamodeler\bin) folgende Zeilen am Ende hinzufügen: AddVMOption -Duser.language=en AddVMOption -Duser.region=US

Oracle Trace Files anzeigen (ab Oracle 12.2)

(ungeprüft übernommen) Starting with Release 12.2 of Oracle database you can list and view trace files from database server file system by SQL selects. Dynamic performance views for representation of trace files are: V$DIAG_TRACE_FILE: lists files from ADR (automatic diagnostic repository) V$DIAG_TRACE_FILE_CONTENTS: lists text content of trace files with one record per line Quelle: https://rammpeter.blogspot.com/2019/09/panorama-list-oracle-trace-files-and.html

APEX 19.1 - Status Meter Gauge

Bild
Mit der Version 19.1 bietet APEX nun Zeiger-Elemente out-of-the-box. Ein zusätzliches Plug-In wird nicht mehr benötigt. Alle Neuerungen siehe https://blogs.oracle.com/apex/announcing-oracle-apex-191  bzw. hier https://apex.oracle.com/en/platform/features/whats-new Wie baut man sowas nun ein? Es braucht eine eigene (Sub-)Region vom Type "Chart". Diese bekommt unter Attribute den Type "Status Meter Gauge". Dadurch werden diverse Deklarationselemente sichtbar, über die das Aussehen sehr weitreichend angepasst werden kann. Für meinen Fall habe ich mich für folgende Einstellungen entschieden: Zu jedem Zeiger/Diagramm gehört eine entsprechende Datenreihe (in APEX "Series" genannt). Für Zeiger hat diese Datenreihe nur eine Zeile, aber mehrere Spalten , mit denen das Aussehen gesteuert werden kann. Das entsprechende Select-Fragment schaut z.B. so aus: select LABEL      , 0 VAL_MIN      , VAL_SET      , VAL_ACT      , VAL_SET*2 VAL_MAX      , c

SQL: Indzies, die nicht partitioniert sind, obwohl die Tabelle partitioniert ist

Gib mir alle Indzies, die nicht partitioniert sind, obwohl die Tabelle partitioniert ist. (Das *KANN* in Ausnahmefällen sinnvoll sein. Macht i.d.R. aber wenig Sinn) select AI.OWNER, AI.INDEX_NAME, AI.PARTITIONED, AI.TABLE_OWNER, AI.TABLE_NAME   from all_indexes AI   left outer join (         select AT.OWNER, AT.TABLE_NAME, AT.PARTITIONED           from all_tables AT          where owner in (UPPER ('MySchema1'), UPPER (' MySchema2 '))            and AT.PARTITIONED = 'YES'        ) TP on TP.OWNER = AI.TABLE_OWNER and TP.TABLE_NAME = AI.TABLE_NAME  where AI.table_owner in (UPPER (' MySchema1 '), UPPER (' MySchema2 '))    and AI.PARTITIONED != TP.PARTITIONED ; (Oracle 12)

Index Rebuild -> alle unusable Idx

Wenn ein Index "kaputt" geht, geht bisweilen nicht mehr viel mit der zugehörigen Tabelle. Zum Prüfen, ob Indizes 'unbenutzbar' sind: (Wichtig ist die getrennte Prüfung für Index, Partition und Subpartition, daher der union all; die Spalten partition_name und ddl_type werden später zur Generierung des SQL benötigt.) select owner      , index_name      , null partition_name      , null ddl_type   from all_indexes  where table_owner = UPPER ('IPUCT3')    and status = 'UNUSABLE' union all select index_owner      , index_name      , partition_name      , 'partition' ddl_type   from all_ind_partitions  where     (index_owner, index_name) in (select owner, index_name                                            from all_indexes                                           where table_owner = UPPER ('IPUCT3'))    and status = 'UNUSABLE' union all select index_owner      , index_name      , subpartition_name      , 'subpartition'

Oracle Insert into Partition

Um Daten direkt in eine bestimmte Partition einzufügen gibt es folgende zwei Varianten: a) mit Partitionsnamen: insert /*+ APPEND */ into myTbl2   partition ( P_123 )      ( K_PARTITION_KEY      , Col2      ) select T1 . K_PARTITION_KEY      , T1.Col2   from myTbl T1   where T1 . K_PARTITION_KEY = 123; b) mit Partitionswert (LIST-Partitioniert): insert /*+ APPEND */ into myTbl2   partition for ( 123 )      ( K_PARTITION_KEY      , Col2      ) select T1 . K_PARTITION_KEY      , T1.Col2   from myTbl T1   where T1 . K_PARTITION_KEY = 123; Vorteil: Es wird nur die betroffene Partition gelocked. Andere Partitionen können parallel "bearbeitet". Nachteil: Der Partitionsname oder -wert muss vorher mitgegeben werden -> also dyn. SQL.