OS X Suchfelder in Safari

Safari hat eine schöne Funktion. Trifft er im HTML Text einer Seite auf ein input Element vom Typ “search”, so stellt er es so dar:

Suchfeld im Safari

Der Inputtyp “search” ist allerdings nicht XHTML konform. Mit einem kleinen JavaScript, dass man beim onload des Bodies ausführt, bekommt gültiges XHMTL raus.

Im XHTML Code der Seite ganz normal den Typ “text” notieren und eine Id vergeben:

<input type="text" id="searchtextinput" title="Suche" name="s"/>&#160;<input type="submit" value="go!" />

danach eine JavaScript Funktion mit folgendem Inhalt erstellen und onload ausführen:

var input = document.getElementById("searchtextinput");
input.type = "search";

| Comments (0) »

01-May-06



Reverse PathIterator

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.

| Comments (0) »

24-Apr-06


Haufenweise: Bulk Insert, Update, Delete

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;

| Comments (2) »

24-Apr-06