Ich komme immer wieder durcheinander, wenn ich die ER Notation vom Oracle Case (“Krähenfüsse”) in die Min/Max Notation anderer Tools “umrechnen” muss. Bin da auf ein ausführliches PDF der Uni Gießen gestoßen, dass nebenbei auch noch mal ausführlich alle sinnvollen Relationen auflistet:
Oracle Designer I: ER-Diagrams
Share This
Ein PathIterator ist in Java eine elegante Möglichkeit, alle Knoten und Kanten einer Form zu iterieren. Was dem eingebauten PathIterator leider fehlt, ist die Möglichkeit, die Form umgekehrt zu iterieren.
Nach eingem Suchen bin ich auf die tolle Klasse ReversePathIterator von caff.de gestoßen: Reverse PathIterator, mit Quelltext und allem. Sehr praktisch, zumal er sich vollkommen transparent statt des Originals nutzen lässt.
Share This
Bulk Methoden in PL/SQL sind praktisch und schnell. Auch recht einfach anzuwenden. Allerdings ist mir in Oracle 9.2.0.6 ein sehr komisches Verhalten aufgefallen:
DECLARE
TYPE id_table IS TABLE OF NUMBER;
objekt_ids id_table;
BEGIN
SELECT id
BULK COLLECT INTO objekt_ids
FROM irgendwas
WHERE irgendwasanderes = 'wasweißich';
FORALL idx IN objekt_ids.first .. objekt_ids.last
DELETE FROM table1 WHERE objekt_id = objekt_ids(idx);
FORALL idx IN objekt_ids.first .. objekt_ids.last
DELETE FROM table2 WHERE objekt_id = objekt_ids(idx);
-- ...
END;
Das Beispiel ist jetzt natürlich erstmal sinnlos, ist aber auch egal. Der Haken an der Sache: Das BULK COLLECT INTO Statement wirft keine NO_DATA_FOUND Exception, wenn die Ergebnismenge leer ist (im Gegensatz zu einem normalen SELECT INTO). Nichts desto trotz ist object_ids danach eine korrekt initialisierte Zusammenstellung.
War die Ergebnismenge leer, gibt es trotzdem eine Exception. Und zwar eine INVALID_NUMBER. Aus irgendeinem Grund laufen die forall Schleifen, auch wenn die virtuelle Tabelle leer ist.
Deshalb gilt für BULK Methoden: Abfragen, ob die Indextabellen leer sind!
DECLARE
TYPE id_table IS TABLE OF NUMBER;
objekt_ids id_table;
BEGIN
IF(objekt_ids.COUNT > 0)THEN
SELECT id
BULK COLLECT INTO objekt_ids
FROM irgendwas
WHERE irgendwasanderes = 'wasweißich';
FORALL idx IN objekt_ids.first .. objekt_ids.last
DELETE FROM table1 WHERE objekt_id = objekt_ids(idx);
FORALL idx IN objekt_ids.first .. objekt_ids.last
DELETE FROM table2 WHERE objekt_id = objekt_ids(idx);
-- ...
END IF;
END;
Share This
In den meisten “neueren” und höheren Programmiersprachen gibt es eine Stringmethode, die “Suchen und ersetzen” implementiert oder wenigstens Bibliotheken, die so etwas können.
Applescript kann das nicht.
Um auf Planet-Punk.de meine iTunes Charts ohne LastFM präsentieren zu können, brauchte ich aber genau sowas:
on searchAndReplace(s, r, t)
set d to text item delimiters
set text item delimiters to s
set t to t's text items
set text item delimiters to r
tell t to set t to beginning & ({""} & rest)
set text item delimiters to d
return t
end searchAndReplace
Diese kleine Funktion sucht im Text t nach s und ersetzt jedes Vorkommen durch r.
Zack und schon ‘nen Bug im Code Snippet Plugin für WP gefunden…. Zeile 28 der AppleScript Datei für GeSHi ist falsch:
Statt
'QUOTEMARKS' => array('"',"'"),
darf sie nur
'QUOTEMARKS' => array('"'),
lauten. Wenn man nicht alles selber macht…
Share This
Ein sehr schöner Lesetipp:
The Law of Leaky Abstractions
oder: Warum man auch das kennen sollte, was abstrahiert wird.
Share This