Posts

APEX 19.1 Interactive Grid (IG) - zusätzliche Spalten

Mit Version 19.1. werden die IG in APEX noch besser benutzbar (Detail u.a. bei Carsten hier:  https://blogs.oracle.com/apex/new-declarative-options-for-interactive-grid ) Ein Problem bleibt: Wenn über der Tabelle myTAB1 das IG aufgesetzt wird funktioniert alles super. Will man aus myTAB2 weitere Daten auch nur anzeigen wirds schwierig: APEX reklamiert fehlende Berechtigungen für myTAB2, obwohl es hier nur select-Rechte benötigt. Also ein select für das Grid auf eine Tabelle ist kein Problem: SELECT Col1_A      , Col1_B      , Col1_C   FROM myTAB1; Soll aus myTAB2 z.B. eine Summe angezeigt werden, wirds spannender: SELECT Col1_A      , Col1_B      , Col1_C      , D.Anz   FROM myTAB1        JOIN (  SELECT Col2_A, COUNT (*) Anz                  FROM myTAB2              GROUP...

SQL Plan Directives - Oracle 12.1 / Oracle 12.2

ein interessanter Artikel zu SQL Plan Directives findet sich hier: http://dbaparadise.com/2018/03/what-are-sql-plan-directives/ und http://dbaparadise.com/2018/03/what-should-you-do-with-sql-plan-directive-changes-in-12-1/ In Kürze: "SQL Plan Directives are objects that contain additional information and instructions for the optimizer, to generate a “better” execution plan." ... Abzufragen ggfs. über DBA_SQL_PLAN_DIRECTIVES bzw. DBA_SQL_PLAN_DIR_OBJECTS

Alter Table-Script

Blueprint für Alter Table-Script zum Anfügen einer neuen Spalte: -- *** Spalte COL_AB *** -- Step 1 - Spalte anfügen BEGIN     EXECUTE IMMEDIATE 'ALTER TABLE MY_TBL ADD COL_AB number(1)'; EXCEPTION     WHEN OTHERS THEN         IF sqlcode =-1430 THEN NULL; ELSE RAISE; END IF; END; / -- Step 2 - Spalte auf gewünschten Typ ändern,falls Spalte bereits existierte BEGIN     EXECUTE IMMEDIATE 'ALTER TABLE MY_TBL MODIFY COL_AB number(1)'; EXCEPTION     WHEN OTHERS THEN         IF sqlcode =-1442 THEN NULL; ELSE RAISE; END IF; END; / -- Step 3 - Kommentar COMMENT ON COLUMN MY_TBL.COL_AB IS 'Spalten-Kommentar';

CSV-Export für Excel - UTF8-Problem

Ärgerliches Problem: Beim Erzeugen einer CSV-Datei "von Hand" (z.B. in APEX) wird eine korrekte UTF8-Datei erzeugt - ABER: z.B. Excel erkennt die UTF8-Kodierung nicht und stellt Umlaute etc. falsch dar. Lösung: Durch voranstellen der entsprechenden Byte Order Mark (BOM) läßt sich Excel auf die Sprünge helfen. Konkretes PL/SQL-Beispiel:   v_UTF8_BOM varchar2(10) := CHR(15711167); ...  htp.prn( v_UTF8_BOM||'"Spalte1";"Spalte2"'|| chr(13)    ); ...und schon klappts auch mit Excel Quelle: Gerd Volberg in RedStack Magazin Nr4?-2018

SQL - Referenzen auf eine Tabelle ermitteln

Damit das Einfügen in eine Tabelle der DIRECT LOAD erfolgen kann, dürfen keine Referenzen auf diese Tabelle aktiv sein. Zum prüfen, welche Referenzen es gibt und welchen Status diese haben: -- Tabelle wird referenziert von... Select c1.owner, c1.constraint_name, c1.table_name, c1.r_owner, c1.r_constraint_name, c2.table_name r_table_name,        c1.delete_rule, c1.status, c1.DEFERRABLE, c1.DEFERRED, c1.validated, c2.constraint_type r_constraint_type FROM   sys.ALL_CONSTRAINTS c1, sys.ALL_CONSTRAINTS c2 WHERE  c1.constraint_type = 'R' AND    c2.constraint_type IN ('P', 'U') AND    c2.owner = 'mySchema' AND    c2.table_name = 'myTable' AND    c1.r_owner = c2.owner AND    c1.r_constraint_Name = c2.constraint_name order by 1,3; Zum Abschalten (nicht Löschen!): -- erzeugt SQL zum Abschalten der Referenzen: Select 'alter table '||c1.owner||'.'||c1.table_name||' disable constraint '||c1.const...

Abfrage, Partitionen ohne Statistiken

Um zu bestimmen, welche Partitionen keine Statistiken haben: select ATP.TABLE_OWNER      , ATP.TABLE_NAME      , ATP.TABLESPACE_NAME      , ATP.COMPRESSION      , ATP.NUM_ROWS      , ATP.LAST_ANALYZED   from  ALL_TAB_PARTITIONS ATP  where ATP.PARTITION_NAME = 'P_5'  order by ATP.LAST_ANALYZED desc nulls first  ; -> fragt alle Tabellen mit gleichem Partitionsnamen ab. select ATP.INDEX_OWNER      , ATP.INDEX_NAME      , ATP.TABLESPACE_NAME      , ATP.COMPRESSION      , ATP.NUM_ROWS      , ATP.LAST_ANALYZED   from ALL_IND_PARTITIONS ATP where ATP.PARTITION_NAME = 'P_5' order by ATP.LAST_ANALYZED desc nulls first ; -> fragt alle Indizes mit gleichem Partitionsnamen ab. Prüfen, ob die Tabellenstatistik älter als die Partitionsstatistik ist: select ATP.TABLE_OWNER   ...

Statistiken nur für eine Partition erzeugen

Um Statistiken nur für eine Partition zu erzeugen: exec DBMS_STATS.GATHER_TABLE_STATS (ownname => 'MySchema',tabname => 'MyTab',partname => 'P_5',granularity => 'PARTITION'); Hinweis: Dabei werden ggfs. KEINE globalen Statistiken aktualisier.