Posts

Es werden Posts vom Juni, 2019 angezeigt.

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.

bulk collect und for loop / Constraints ab- und wieder anschalten

Manchen Operationen (wie z.B. truncate oder drop partition) können nicht mit aktiven Constraints auf die Tabelle ausgeführt werden. Daher hat sich folgender Ablauf bewährt: - aktive Constraints abzuschalten - eigentliches Drop / truncate - obige Constraints wieder einschalten (Idealerweise "merkt" man sich die betroffenen Constraints und schaltet nicht pauschal alle Constraints wieder ein.) Im Code kann das dann so aussehen: Vorab - Typen definieren und Fehlerhandling vorbereiten -- Type für Drop_Partition_FS definieren   -- Datentypen aus SYS.ALL_CONSTRAINTS   type x IS     record     (       OWNER VARCHAR2 (128 Char),       TABLE_NAME VARCHAR2 (128 Char),       CONSTRAINT_NAME VARCHAR2 (128 Char),       STATUS VARCHAR2 (8 Char)) ;   type y IS     TABLE OF x;     z y; -- globale Variablen   part_missed EXCEPTION;   PRAGMA EXCEPTION_INIT (part_missed, -2149);      v_Sql     varchar2(4000);  -- SQL-String Eigentliche Umsetzung:   -- FK-Constrain

Partition Exchange - Tmp-Tbl erstellen

Ein echtes Problem beim Partition Exchange war bisher, die zu tauschende Tabelle in genau der Struktur zu erstellen, dass diese mit der partitionierten Tabelle zusammen passt. Spätestens mit den hidden columns, die Oracle ggfs. selbst anlegt, wurde Partition Exchange zum Lotto-Spiel. Ab Oracle 12 gibt es eine Lösung hierfür: CREATE TABLE myTbl_tmp FOR EXCHANGE WITH TABLE myTbl Es macht genau das, was es soll :-) ...gefunden bei Dani Schnider: https://danischnider.wordpress.com/2017/02/09/partition-exchange-in-oracle-12-2/

PL/SQL Fehlerhandling eigene Fehlercodes etc.

Ein Beispiel für eigenes Fehlerhandling: DECLARE   obj_missed EXCEPTION;   PRAGMA EXCEPTION_INIT ( obj_missed , -942); BEGIN EXECUTE IMMEDIATE('DROP TABLE mytst'); EXCEPTION   WHEN  obj_missed  THEN NULL;   WHEN OTHERS THEN RAISE; END; / Eine weitere Variante: BEGIN     EXECUTE IMMEDIATE 'DROP TABLE  mytst '; EXCEPTION     WHEN OTHERS     THEN         IF SQLCODE = -942           THEN  NULL;           ELSE  RAISE;         END IF; END; /