Posts

Es werden Posts vom 2009 angezeigt.

APEX und Sicherheit - Proxy-Schema

Ein weiterer Schritt zu sicheren APEX-Anwendungen ist die Nutzung eines Proxy-Schema's: Während die komplette Anwendung im Schema A liegt, arbeitet die APEX-Anwendung mit dem leeren Schema B. User B hat nur create session und create synonyme Recht. Hier werden zu den relevanten Objekten des Schema A Synonyme erstellt. Per Objekt-Berechtigung kann B auf die Objekte in Schema A zugreifen. Wurde die APEX-Anwendung zuvor im Schema A entwickelt und soll nun nach B umgezogen werden, so ist: die Anwendung zu exportieren ein neuer Workspace (WS) für Schema B zu erstellen in den neuen WS die Anwendung importieren anschliessend ist auf allen Seiten mit folgenden Prozessen der owner zu ändern : process row fetch row ApplyMRU Anschliessend sollte alles wie gewünscht funktionieren.

Error Logging im DML, DBMS_ERRLOG, ERR$

Mindestend ab Version 10g erlaubt Oracle das Loggen von Fehlern in einer separaten Tabelle - sehr nützlich für Fehleranalyse: Vorgehen: 1) Zur entsprechenden Tabelle die ERR$-Tabelle anlegen: exec dbms_errlog.create_error_log( <Tbl>); 2) Das entsprechende Statement mit dem Zusatz LOG ERRORS REJECT LIMIT UNLIMITED; aufrufen. 3) Nach dem Lauf evtl. Prüfen: select * from ERR$_<Tbl> ; Quellen: http://www.psoug.org/reference/dbms_errlog.html http://askanantha.blogspot.com/2008/06/error-logging-using-dbmserrlog.html http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/transform.htm#sthref786 Wichtig: Die ERR$-Tabelle will gepflegt werden. Gerade bei LIMIT UNLIMITED kann die Tabelle u.U. schnell sehr groß werden! U.U. VOR dem Lauf diese Tabelle truncaten, damit sofort die Meldungen des aktuellen Laufs analysiert werden.

Die drei Schreibweisen in APEX

Heute wieder ein Beitrag aus der Reihe: "Zum tausendsten Mal gesucht" Notation in APEX: APP_USER Syntax Bind variable -  :APP_USER PL/SQL -   V('APP_USER') Substitution string -  &APP_USER.

Neues im Toad 10

Wichtigste Neuerungen in der 10er Version des Toad: - Erweiterung der ER-Diagramme - Script Manager -> paralleler Zugriff auf mehrer Datenbanken - Automation Designer -> weitere Details: http://www.toadworld.com/Portals/0/ToadTechPapers/Toad%20for%20Oracle%20AppDesigner.pdf - Search Bar - braucht heute jedes Programm ;-) - neues DataGrid - mit Gruppierungsfunktion - Unicode-Support weitere Details zur neuen Version finden sich hier: http://www.quest.com/Quest_Site_Assets/TechnicalBriefs/TBD-Toad4Oracle10-US-AG.pdf Hinweis: Zur neuem Version gibt es bereits auch einen Patch.

Test Data Modeler (SDDM)

Als eigenständiges Tool neben dem SQL Developer wurde im Juli der SQL Developer Data Modeler veröffentlicht (siehe auch http://www.oracle.com/technology/products/database/datamodeler/index.html ). Ein erster Test hat folgende Ergebnisse gebracht: 1. Test: * Logisches Modell mit 2 Dimensionen (DIM_LE, DIM_PAT) und 1 Fakt-Tabelle (FACT_VO) neu erstellen -> Problem: FK über Quartal+LE_ID und Quartal+PAT_ID nicht möglich (es wird immer eine zusätzliche Spalte Quartal1 an FACT_VO angefügt). 2. Test * relationales Modell mit 2 Dimensionen (DIM_LE, DIM_PAT) und 1 Fakt-Tabelle (FACT_VO) neu gebaut - FK-Beziehung nun möglich + Naming-Standards können manuell angewendet werden + eigene Domain aufbauen + Modell als XML-File z.B. in svn verwalten + Typ einer Tabelle (Dimension, Fact) kennzeichenbar -> farbliche Unterscheidung * Abkürzungen im Tabellennamen für sinnvolle FK-Namen wichtig * physikal. Modell erstellen -> Einstellung physikal Parameter (Partitionen, IOT etc.

DROP TABLE IF EXISTS (or SEQUENCE or INDEX or COLUMN) - ohne ORA- Fehler

Scripting: Leider habe ich keine SQL-Möglichkeit gefunden ORA-00942 Fehler bei DROP TABLE im Script zu vermeiden: Die Tabelle soll durch DROP ja gelöscht werden und wenn diese nicht existiert (= ORA-00942 Table does not exists) ist das eigentlich kein Fehler. meine Lösung: begin execute immediate'   DROP TABLE list_pzn   '; exception when others then if sqlcode = -1418 then null; else raise; end if; -- Index   --exception when others then if sqlcode = -2289 then null; else raise; end if; -- Sequenz     --exception when others then if sqlcode = -942 then null; else raise; end if; -- Tabelle --exception when others then if sqlcode = -2443 then null; else raise; end if; -- Constraint  --exception when others then if sqlcode = -1918 then null; else raise; end if; -- User  --exception when others then if sqlcode = -4043 then null; else raise; end if; --Type --exception when others then if sqlcode = -904 then null; else raise; end if; -- Spalte   end; /  Nachteil

date und timestamp - Artikel von Carsten Czarski

Carsten Czarski hat einen sehr guten Artikel zum Thema date und timestamp geschrieben. Zu finden unter http://sql-plsql-de.blogspot.com/2009/09/date-und-timestamp-in-sql-und-plsql.html ... unbedingt mal reinschauen.

APEX und Sicherheit

Da das Thema Sicherheit von APEX-Anwendungen mir immerwieder über den Weg läuft, werde ich hier einige - mir nützlich erscheinende - Link zusammenfassen, die sich mit diesem Thema beschäftigen: Sichere Application Express-Anwendungen: Einige Tipps Von Niels de Bruijn, MT AG, Ratingen Schutz vor "SQL Injection": So bleibt Ihre APEX-Anwendung sicher! Mandantenfähige HTML DB-Anwendungen Mehr Sicherheit mit "Session State Security" Developing Secure Applications By David Peake ... ... weitere Einträge werden sicher noch folgen...

Langlaufende Prozesse in ApEx darstellen - Teil 1

Um während der Verarbeitung von Prozessen im Hintergrund den Anwender zu informieren, dass da noch was "am Laufen" ist gibt es verschiedene Möglichkeiten. Nach einiger Rechereche habe ich mich für den Anfang (daher Teil 1) dafür entschieden folgende Lösung umzusetzen: Während der Hintergrundverarbeitung für ein animiertes GIF (ähnlich der Sanduhr) mit entsprechendem Infotext angezeigt. (Sicher noch nicht informativ, aber besser als nichts.) Zusätzlich wird der ungeduldige Anwender vor sich selbst geschützt: Die Schaltfläche zum Starten des Hintergrundprozesses wird für die Dauer der Ausführung ausgeblendet. (Dadurch wird verhindert, dass der Prozess parallel erneut gestartet wird.) Umsetzung: 1) Die Region mit dem Startknopf mit einer ID versehen: button_region 2) Page-Header und -Footer anpassen: Header Text < script type="text/javascript"> < !-- function html_Submit_Progress(pThis){ $x_Show('AjaxLoading'); window.setTimeout('$s(&qu

DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS

Für langlaufende Prozesse kann es hilfreich sein, entsprechende Informationen über den Prozessfortschritt in die entsprechende Oracle-View einzutragen. Dazu dient DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS Oracle-Doku: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_appinf.htm#i996999 Am konkreten Beispiel kann das so aussehen: procedure proc    (      p_A in number,      p_B in number    ) is    ...    -- für APP_INFO    rindex pls_integer := -1;    slno pls_integer; begin   ... -- APP_INFO dbms_application_info.set_session_longops(    RINDEX => rindex    ,SLNO => slno    ,OP_NAME => 'APEX: < Name des Paketes > '    ,SOFAR => 1    ,TOTALWORK => 7    ,target_desc => ' < Name der Prozedur > ' ); ... RINDEX und SLNO - sind intern gebrauchte Werte siehe Doku. OP_NAME - beschreibt die Aktion -> zu sehen z.B. auf der long-

Oracle Launch 11gR2 in München

Einleitung / Verschiedenes 11gR2 XE: neue Express-Edition 11gR2 wird kommen (erst 2010) ASM Conig Assistent, neu intelligent DataPlacement Spaltenorientierte Speicherung nur als Option (HCC) mit Exadata2 mit Komprimierung 80% Platz sparen HCC = Hybrid Columnar Compression Neuheiten für den DBA Upgrade Manual - für Umstieg auf 11gR2 vorhanden neuer Installer erlaubt Response-File Erstellung (kostenpflichtige) Optionen nur noch, wenn EE ausgewählt wurde Test's für Upgrades sind bereitgestellt Sheduler shagent start -> eigene Agenten auf DB-Servern Job's auf fremden DB's laufen lassen File Watcher -> wartet auf Eintreffen einer Datei, als Event für DB-Job Email-Benachrichtigung Data-Pump alle Exp/Imp-Parameterdateien weiterverwendbar langfristig KEIN Exp mehr unterstützt Execute-Privileg für Directories Erlaubt unzip, dann Laden von Daten aus der DB heraus DB Vaul

SQL: Vorsicht bei LAG / LEAD

Mit den Analytischen Funktionen von Oracle lassen sich elegant tolle Dinge lösen. Ein Bsp. ist LAG siehe auch Doku: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions070.htm#SQLRF00652 Doch Vorsicht : LAG(spalte, 1) liefert den Nachfolger im ROWSET ! Das ist aber nicht immer der gesuchte Wert! Bei Lücken im Rowset (für ein Quartal gab es keine Werte) verschieben sich die mit LAG gelieferten Ergebnisse. Bsp: drop table fs_tst; create table fs_tst ( quartal number, hnr number, wert number ); insert into fs_tst values (20091, 10, 1); insert into fs_tst values (20092, 10, 2); -- Quartal 20093 fehlt insert into fs_tst values (20094, 10, 3); insert into fs_tst values (20091, 20, 4); insert into fs_tst values (20092, 20, 5); -- Quartal 20093 fehlt insert into fs_tst values (20094, 20, 6); insert into fs_tst values (20101, 10, 7); insert into fs_tst values (20102, 10, 8); insert into fs_tst values (20111, 10, 9); commit; select * from fs_tst; select quarta

select mit with

Quelle: Oracle 10R2 Doku: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10002.htm#i2129904 Subquery Factoring : Example The following statement creates the query names dept_costs and avg_cost for the initial query block containing a join, and then uses the query names in the body of the main query. WITH dept_costs AS ( SELECT department_name, SUM(salary) dept_total FROM employees e, departments d WHERE e.department_id = d.department_id GROUP BY department_name), avg_cost AS ( SELECT SUM(dept_total)/COUNT(*) avg FROM dept_costs) SELECT * FROM dept_costs WHERE dept_total > (SELECT avg FROM avg_cost) ORDER BY department_name;

OID (Objekt-Identifikatoren) beim DIMDI

Erläuterungen zur Systematik der OID finden sich beim DIMI Quelle: http://www.dimdi.de/static/de/ehealth/oid/index.htm Die OID-Suche findet sich unter http://www.dimdi.de/dynamic/de/ehealth/oid/verzeichnis.html Datenobjekte für effiziente Software kommunikation in der Telematik Beim standardisierten Austausch von Gesundheitsinformationen ist es notwendig, Objekte und Nachrichten eindeutig zu bezeichnen. Objekt-Identifikatoren ( OID ) sind Zahlenketten zur Kennzeichnung dieser Objekte und Nachrichten. Objekte sind dabei Informationseinheiten wie Institutionen, Klassifikationen, Nachrichten, Dokumente oder Tabellen. Beispiel: Mit der Klassifikation ICD -10- GM Version 2006 kann die Grippe durch nachgewiesene Vogelgrippe-Viren mit dem Kode J09 in XML - Technologie wie folgt dargestellt werden: < value code ="J09" codeSystem ="1.2.276.0.76.5.311"/> Sie können diese OID für den standardisierten Datenaustausch zwischen Software systemen nutzen und dadurch

APEX: Regionen mit fester Breite

gefunden bei Thomas Arnhold: http://apex-at-work.blogspot.com/2009/01/multiple-apex-regions-in-same-size.html 1) Region-Template um Eintrag #REGION_ATTRIBUTES# > #BODY# erweitern (Bsp: [ td align = "center" colspan = "2" #REGION_ATTRIBUTES# ] #BODY# [/ td ]) 2) Style-Angabe im Feld Region Attributes machen (Bsp. style="width:600px") ... schon klappts mit der einheitlichen Breite

Link zu EMP und DEPT Demo-Tabellen

Hier gibt es das Script für das Oracle-Std-DEMO-Schema: http://www.oracle.com/technology/sample_code/tech/sql_plus/htdocs/demobld.html Damit kann sich jeder die EMP- und DEPT-Tabellen nachbauen...

merge - Syntax

immer wieder gesucht: MERGE INTO bonuses D USING (SELECT employee_id, salary, department_id FROM employees WHERE department_id = 80) S ON (D.employee_id = S.employee_id) WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01 DELETE WHERE (S.salary > 8000) WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus) VALUES (S.employee_id, S.salary*0.1) WHERE (S.salary <= 8000); Quelle: Oracle-10gR2-Doku - http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9016.htm#SQLRF01606 bzw. etwas ausführlicher (Jan 2012): Das Kommando ist eigentlich selbsterklärend: Man kann sehr schön die einzelnen Abschnitte erkennen: MERGE INTO ... gibt das Ziel der MERGE-Operation an (typischerweise eine Tabelle) USING ... gibt die Datenquelle an; das kann eine Tabelle, eine View oder eine SELECT-Abfrage, welche Literale " from DUAL " selektiert, sein. ON ( matching-kriterium ) legt fest, wie

run-only Applikationen löschen / aktualisieren

Bild
In APEX 3.2 ist es nicht möglich, eine im Status run-only befindliche Anwendung durch erneutes Importieren zu aktualisieren . (Das Einspielen einer neuen Version gelingt bei Vergabe einer neuen Programm-ID, was aber selten gewünscht ist.) Um eine neuere Version mit gleicher ID einspielen zu können, muss die bestehende Anwendung erst gelöscht werden. Eine run-only Anwendung kann aber nicht gelöscht werden. (Warum auch immer???) Der Workspace-Admin muss 1) den Status der Anwendung auf run-and-build ändern, 2) die bestehende Anwendung löschen 3) die neue Version einspielen. Um den Status zu ändern: erst Managed Service wählen, dann Manage App Build Status klicken

exists <-> in

Quelle: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:442029737684 Can you pls explain the diff between IN and EXISTS and NOT IN and NOT EXISTS. Because I have read that EXISTS will work better than IN and NOT EXISTS will work better than NOT IN (read this is Oracle server tunning). Regards, Madhusudhana Rao.P and we said... see http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:953229842074 It truly depends on the query and the data as to which is BEST. Note that in general, NOT IN and NOT EXISTS are NOT the same!!! SQL> select count(*) from emp where empno not in ( select mgr from emp ); COUNT(*) ---------- 0 apparently there are NO rows such that an employee is not a mgr -- everyone is a mgr (or are they) SQL> select count(*) from emp T1 2 where not exists ( select null from emp T2 where t2.mgr = t1.empno ); COUNT(*) ---------- 9 Ahh, but now there are 9 people who are not managers. Beware the NULL value and NOT IN

(Text-)Zeilen zusammenfassen

Um Ergebnisse wie diese zu erreichen: DEPTNO EMPLOYEES ---------- -------------------------------------------------- 10 CLARK, KING, MILLER 20 SMITH, FORD, ADAMS, SCOTT, JONES 30 ALLEN, BLAKE, MARTIN, TURNER, JAMES, WARD hat Carsten Czarski ein PL-Bsp veröffentlicht: http://sql-plsql-de.blogspot.com/2007/03/group-by-wird-zusammen-mit.html Neu in 11G R2 : Die LISTAGG-Funktion siehe auch http://www.oracle.com/global/de/community/tipps/11gR2/index.html

partition exchange - Tabelle aus Range-Partition in Range-List-Partition umbauen

Nachdem bereits Range-Partitionen in einer Tabelle existieren, sollen zusätzliche Daten in Subpartitionen strukturiert werden: Mögliches Vorgehen unter 10gR2 unter der Voraussetzung, dass die bestehenden Daten später in genau einer Subpartition landen werden: unpartitionierte Temp-Tabelle erstellen bestehende Partition der Quelltabelle in Temp-Tabelle überführen (per exchange) Quelltabelle in neuer Struktur (mit Subpartitionen) neu erstellen Temp-Tabelle (per exchange) als Subpartition in neu erstellte Tabelle einfügen Da alles über Tabellenmetadaten läuft und somit keine Daten kopiert bzw. physikalisch verschoben, sollte die Datenmenge keine Rolle spielen. Beispiel: -- Ausgangstabelle erstellen DROP TABLE fs_ptest; CREATE TABLE fs_ptest ( quartal NUMBER (5), fallstatus varchar2(3), bsnr VARCHAR2 (9), lanr VARCHAR2 (9) ) PARTITION BY RANGE (quartal) (PARTITION pmaxval VALUES LESS THAN (maxvalue)

Prüfen von Werten, isnumber

Immer mal wieder kommt das Thema: Ist der Wert eine Zahl oder nicht? Bis Oracle 10g am besten per Translate: translate(spalte,'a0123456789', 'a') gegen null prüfen Anm: Das 'a' ist wichtig! - Translate braucht min. 1 Buchstaben, den es ersetzen soll - Im Bsp wird a durch a ersetzt, 0 durch nix, 1 durch nix, ... 9 durch nix -> Ergebnis: wenn der Rückgabewert null ist, waren nur Ziffern enthalten. Übersichtlicher wird's ab 10g per regular Expressions: REGEXP_LIKE (wert,'^[[:digit:]]{3}$') - Prüft, ob genau 3 Ziffern enthalten sind. Weitere Möglichkeiten und Erläuterungen u.a.: http://www.oracle.com/global/de/community/tipps/regexp/index.html und http://sql-plsql-de.blogspot.com/2009/02/regulare-ausdrucke-in-der-datenbank.html bzw. in der Doku: http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/conditions007.htm#i1048942

neue Version Oracle SQL Developer Data Modeler

gerade gefunden: auf der Oracle-Seite gibt es eine aktualisierte Version des Datamodelers (Version 2.0.0-570 vom 01.Juli) http://www.oracle.com/technology/products/database/datamodeler/index.html bzw. direkt zum Download: http://www.oracle.com/technology/software/products/sql/datamodeler.html

rang im SQL

Bisweilen sehr nützlich ist ein Ranking der Ergebniszeilen: Bsp: select quartal, pg_id, vgl_key, row_number() over (partition by pg_id order by pg_id) pg_rang, row_number() over (partition by vgl_key order by vgl_key) vg_rang from (select distinct quartal, pg_id, vgl_key from REP_PG_RTM where QUARTAL = 20091); Die innere Abfrage liefert alle Kombinationen von PG und VG. Dabei können natürlich einzelne PG (bzw. VG) mehrfach vorkommen: 102 - 128 102 - 129 104 - 129 Sollen PG- und VG-Summen (Bsp. Fälle) zugeordnet werden, werden diese für jede Zeile zugeordnet: 1.427 Fälle - 102 -- 128 - 1.627 Fälle 1.427 Fälle - 102 -- 129 - 1.514 Fälle 1.312 Fälle - 104 -- 129 - 1.514 Fälle Für Prüfsummen über die zugeordneten Fälle ist das ungünstig, dann darf die Fallzahl nur EINMAL gelistet werden: 1.427 Fälle - 102 -- 128 - 1.627 Fälle - 102 -- 129 - 1.514 Fälle 1.312 Fälle - 104 -- 129 - Hier hilft das Rang: Durch das Ranking wird das Vorkommen der Zeilen gezählt und

Firefox Add-Ins

Eine Liste meiner Firefox-Plug-Ins: noscript - zusätzlicher Browserschutz Firefox Sync - Synchronisation von Bookmarks, Historie, Browsereinstellungen etc. simpletranslate - Übersetzung (leo.org) bzw. Erklärung (Wikipedia) per Kontextmenü Ghostery - informiert über web bugs FireBug DownloadHelper QuickProxy - schnelles Ein- und Ausschalten des BrowserProxy weitere können folgen ;-) folgende Add-ons werden nicht mehr verwendet: IE Tab - ruft Seiten per IE Rendering auf (unsicher!) ReadItLater - Bookmarking von Seiten (Achtung: Bookmarks werden online gespeichert, stehen dafür aber auch in allen Browsern zur Verfügung. Vorteil: Bookmarks können nach dem Lesen leicht wieder gelöscht werden.

Prozentbalken in APEX-Reports

gefunden unter http://apex-smb.blogspot.com/2009/06/displaying-percentage-bar-in-apex.html über ... PCT_GRAPH: Hex background color : Hex foreground color : Bar width in pixels ... in der Spaltendefinition, Feld Datum/Nummer-Formatierung läßt sich der Prozentwert graphisch darstellen. Bsp.: PCT_GRAPH:330099:CC0000:100

Unterschiedliche Detaillevel im Report

Herausforderung: Ein Report soll unterschiedliche Detaillevel anzeigen. Die Beispiel-Tabelle: drop table fs_t1; create table fs_t1 ( ddd number, ddd_vgl number, wert_B number, wert_S number, ziel number ); insert into fs_t1 values (1, 1, 10, 15, 20); insert into fs_t1 values (2, 2, 20, 25, 31); insert into fs_t1 values (2, 12, 20, 25, 32); insert into fs_t1 values (3, 13, 30, 35, 40); insert into fs_t1 values (3, 3, 30, 35, 40); commit; select ddd, ddd_vgl,wert_B, wert_S, ziel from fs_t1; DDD DDD_VGL WERT_B WERT_S ZIEL ---------- ---------- ---------- ---------- ---------- 1 1 10 15 20 2 2 20 25 31 2 12 20 25 32 3 13 30 35 40 3 3 30 35 40 5 rows selected. Zu DDD 2 gibt es zwei unterschiedliche Vergleichs-DDD's mit unterschi

OWB mit aktuellem JRE starten

Vorgehen, um den OWB unter Windows mit aktuellem JAVA zu starten: !!! Wichtig: keine Ahnung, ob das Supportet ist, daher alles ohne Gewähr!!! 1) Aktuelles JRE installieren 2) Im OWB-Home (Bsp: C:\Programme\owb1020\owb\bin\win32) - Sicherungskopien der Datei owbclient.bat erstellen - Sicherungskopien der Datei setowbenv.bat erstellen 3) in Datei setowbenv.bat zwei Zeilen ändern: - Zeile set JAVAPATH= (Bsp.: set JAVAPATH=C:\Programme\Java\jre6) - Zeile set JDK_HOME= (Bsp.: set JDK_HOME=C:\Programme\Java\jre6) - Rest belassen 4) in Datei owbclient.bat folgenden Eintrag ändern: - %JAVAPATH%\jre\bin\java auf ändern (Bsp.: %JAVAPATH%\bin\java) - Rest belassen 5) OWB-Start über owbclient.bat Hintergrund: Mit "seinem" JRE hat sich der OWB nach kurzer Zeit stark mit sich selbst beschäftigt: Bei jedem Maus-Klick - CPU-Auslastung von 100% und totale Blockade des Rechners. Mit dem aktuellen JRE ist das Verhalten bisher nicht aufgetreten.

SQL: isol. und kummulierte Werte ermitteln

Um in Reports isolierte und kummulierte Werte parallel anzuzeigen, läßt sich die analytische Funktion von Oracle nutzen: select QUARTAL, PK_ID, Anz_AKT, sum(Anz_AKT) over (partition by PK_ID, ceil(QUARTAL/10) order by QUARTAL) Anz_KUM from ( select F.PK_ID, F.QUARTAL, sum(F.ANZ_FAELLE) Anz_AKT from FACT_TBL F where F.PK_ID in ('123') group by F.QUARTAL, F.PK_ID, ); Der innere select liefert die je Quartal zusammengefassten Werte, die im äußeren select innerhalb des Jahres ( ceil(quartal/10) ) aufsummiert werden. Das Ergebnis ist z.B. folgende Liste: QUARTAL PK_ID ANZ_AKT ANZ_KUM 20021 6410220 9810 9810 20061 6410220 1719 1719 20062 6410220 3819 5538 20063 6410220 3827 9365 20064 6410220 4233 13598 20081 6410220 1168 1168 Innerhalb eines jeden Jahres werden die Werte aufsummiert. So können mit einer Abfrage elegant isol. und kum.

OWB, Outer Join und between

Heute aufgetreten: Der OWB hat Schwierigkeiten einen Outer Join mit einem between (Bsp. SCN2 oder ähnlich) sauber umzusetzen: Konkret wurden "tAc2 >= tBc2(+)" und "tAc2<= tBc3(+)" auseinander gerissen, wodurch die Logik verändert und das Ergebnis FALSCH(!) wurden. WICHTIG: KLAMMER setzen -> dann klappt' auch mit dem OWB! Bsp: where tAc1 = tBc1(+) and ( tAc2 between tBc2(+) and tBc3(+) ) oder where tAc1 = tBc1(+) and ( tAc2 >= tBc2(+) and tAc2<= tBc3(+) )

Abfrage von Partitionen

Per select * from Tbl_Name partition ( Name_der_Partition); Bsp.: select * from BASIS_VO partition (P20083); kann man direkt eine bestimmt Partition abfragen. Wichtig: Für Oracle ist "BASIS_VO partition (P20083)" der Tabellenname, d.h. der Alias muss DAHINTER : select * from BASIS_VO partition (P20083) A where A.HNR = 1234;