Oracle – Erstellen einer Tabellen aus einem Select –in schön–

Viele Wege führen nach Rom. Oder zu einer CSV Datei. In “Oracle: Erstellen einer .csv Datei aus einem Select” hatte ich einen einfachen weg gezeigt, wie man eine Abfrage direkt als csv Datei ausgeben kann.

Natürlich gibt es, falls man Zugriff auf den Oracle Server hat, eine elegantere Methode:
Erstellen einer Procedure, die per utl_file eine csv Datei erzeugt:

CREATE OR REPLACE FUNCTION  dump_csv( p_query IN varchar2
  , p_separator IN varchar2 DEFAULT ','
  , p_dir  IN varchar2 ,  p_filename  IN varchar2 )
RETURN number
AUTHID CURRENT_USER IS
    L_output utl_file.file_type;
    l_theCursor     integer DEFAULT dbms_sql.open_cursor;
    l_columnValue   varchar2(2000);
    l_status        integer;
    l_colCnt        number DEFAULT 0;
    l_separator     varchar2(10) DEFAULT '';
    l_cnt           number DEFAULT 0;
begin
    l_output := utl_file.fopen( p_dir, p_filename, 'w' );
    dbms_sql.parse(  l_theCursor,  p_query, dbms_sql.native );
    FOR i IN 1 .. 255 loop
        begin
        dbms_sql.define_column( l_theCursor, i, l_columnValue, 2000 );
        l_colCnt := i;
        exception
        when others then
            IF ( sqlcode = -1007 ) then exit;
        else
            raise;
        end IF;
        end;
    end loop;
    dbms_sql.define_column( l_theCursor, 1, l_columnValue, 2000 );
    l_status := dbms_sql.execute(l_theCursor);
    loop
    exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 );
        l_separator := '';
        FOR i IN 1 .. l_colCnt
        loop
            dbms_sql.column_value( l_theCursor, i, l_columnValue );
            utl_file.put( l_output, l_separator || l_columnValue );
            l_separator := p_separator;
        end loop;
        utl_file.new_line( l_output );
        l_cnt := l_cnt+1;
    end loop;
    dbms_sql.close_cursor(l_theCursor);
    utl_file.fclose( l_output );
    RETURN l_cnt;
end dump_csv;

Die eleganz liegt darin, das man das Select nicht fest konfiguriert, sondern als Paramter an die Fuktion liefert. Über das Oracle Package dbms_sql wird dann das select zur Laufzeit abbildet.

Aufrufen kann man das dan mit einem einfach PL/SQL Block:


declare
l_rows  number;
begin    l_rows := dump_csv( 'select SYSDATE, USER from dual'
,','            -- Trennzeichen
,'/muell'       -- Verzichnis
,'muell.csv' ); -- Dateiname
end;

oder natürlich über die Funktion execute in SQL*PLUS:

exec dbms_output.put_line('Exportierte Zeile: '||
  dump_csv( 'select SYSDATE, USER from dual'
             ,','           -- Trennzeichen
            ,'/muell'       -- Verzichnis
            ,'muell.csv' ); -- Dateiname

Leider muss ich zugeben, das mir das nicht eingefallen ist, sondern dem genialen Tom Kyte von Oracle (Link). Die Seite Ask Tom ist für alle Oracle Anwender ein Pflicht Bookmark

Google Traffic endlich auch bei uns

Nach langem warten hat google nun auch bei und google Traffic freigeschaltet. Mittel Google Traffic wird in der Kartenansicht ein farbiger overlay angezeigt, durch den die aktuelle Verkehrslage ersichtlich ist.

Das besondere ist, da nicht nur Autobahen angezeigt werden, sonder auch die Auslastung aller  Bundesstraßen und der Straßen in größeren Städten angezeigt werden

Dieser Dienst, dier schon seit 2008 in den USA angeboten wird wurde heute nun neben Deutshcland auch für Österreich, Belgien, Tschechien, Dänemark, Irland, Israel, Luxembourg, Niederlande, Polen, Slovakai, Spanien und die Schweitz veröffentlicht.

Die Verkehrsdaten werden alle 10-15 Minuten aktualisiert.

Am iPhone können die Verkehrsdaten nach dem aufklappen eingeschaltet werden.

via Google LatLong Blog

20% Rabatt auf iTunes Gutscheinkarten

Rechzeitig, nachdem am 12.07. nun wahrscheinlich OS X 10.7 auf den Markt kommen wird, bietet nach Toom nun auch Real 20% Rabatt auf alles iTunes Gutscheinkarten an

Also, schnell noch mit eindecken!

Funkverbindungen – Arduino auf Distanz

Wer kennt das nicht. Da hat man seinen sein schönes Arduino Projekt fertig gestellt, und dann hängt da so ein blödes Kabel dran. Und Kabel sind schlecht für den WAF und sowieso häßlich. Vor allem bei meinem kleinen Projekt hatte meine Frau was dagegen, das ich ein neues Netzwerkkabel durch den Flur lege.

Also muss eine Funkverbindung her. Zum Glück bietet der Arduino “Markt” da schon viele vorgefertigte Lösungen in den tollsten Geschmacksrichtungen. Eine kleine Uberischt:

Fangen wir da ruhig mal (preislich) oben an. Da finden wir dann zum Beispiel das GSM/GPS Shield des deutschen Herstellers Antrax. Liegt bei 150€ und man muss dann auch noch eine Daten SIM, beispielsweise von Simyo mit einer Datenflat mitrechnen. Allerdings lassen sich damit sehr schnell tolle Projekte aufbauen und die Hohe Integration mitsamt GPS lässt zumindest meine Geldbörse zucken. Leider wäre das Shield für mein Projekt ein kleiner overkill. Aber um etwa ein Wochenendhäuschen oder ein Boot zu überwachen eine tolle Lösung.

Weiterlesen

Thermometer mit Arduino

Nachdem ich euch in “Blink” eine kleine Einführung in den Arduino gegeben habe wollte ich mich jetzt mal an etwas “sinnvolleren” versuchen.

Einem Thermometer!

Naja, zumindest so sinvoll wie ein Thermomter ohne Display sein kann…

Mit diesem kleinen Tutorial lernt man wie man einen Analogen Input ausliest, wie man einen Spannungsteiler baut und wie man eine Funktion schreibt.
Viel Stoff also. An die Arbeit!

Wir brauchen:

  • Einen Arduino, z.Bsp.: Duemilanove
  • Ein Steckbrett (Breadboard)
  • Einen NTC Wiederstand mit 4,7 kOhm
  • Einen Wiederstand mit 4,7 kOhm

Weiterlesen

Oracle: Erstellen einer .csv Datei aus einem Select

Wer kennt das nicht. Jeden Monat wieder möchte der Chef eine bestimmte Auswertung auf dem Tisch haben.

Natürlich könnte man nun hingehen und immer wieder das Select ausführen, alle Spalten Kopieren und dann den ganzen Mist in Excel speichern. Aber das wäre mir natürlich zu einfach ;-)

Also nix wie hin und das ganze ein bisschen einfacher machen.

Der erste und trivialste Ansatz ist das direkte ausgeben in eine CSV Datei aus SQL Plus heraus. CSV ist dabei ein Dateiformat das in einer Textdatei einfach strukturierte Daten ablegt. Die Endung steht dabei für “comma seperated values” oder treffender “character seperated value”. Ein Standard gibt es dafür zwar nicht, aber allgemein wird dem RFC 4180 gefolgt und die Zeichen als 7bit ASCII gespeichert.

Als erstes müssen wir nun SQL*PLUS sagen, wie er die Ausgabe der Daten formatiert

SET UNDERLINE OFF
SET COLSEP ';'
SET LINES 100 PAGES 100
SET FEEDBACK off
SET HEADING off

über “SET COLSEP ‘;’” setzen wir hierbei den Spaltenseparator auf ein Semikolon. Natürlich kann auch jedes andere Zeichen genutzt werden.
Dann leiten wir mittels “SPOOL” die Ausgabe in eine Datei um:

SPOOL  C:tmpdatenmuell.csv

Nun können wir jedes beliebige select ausführen und in unsere CSV Datei ablegen lassen. Anschließend müssen wir nur noch über

SPOOL OFF

Die Umleitung wieder zurücknehmen.
Wenn wir nun diese Abfrage als Datei speichern können wir die CSV Datei auch über die Command Line Version von SQL*PLUS direkt aufrufen (siehe auch SQL*PLUS Startoptionen):

sqlplus user/passwort@ORACLE_SID @exportiere_datenmuell.sql

Schon haben wir uns das Leben wieder etwas einfacher gemacht.

SQL*PLUS Startoptionen

Oracle SQL*Plus ist nettes kleines tool, das leider immer wieder unterschätzt wird. Neben dem Frontend in Windwos existieren auch Comandozeilenveriosnen für Unix und Windows. Speziell dieses CLI Verisonen sind für das Skripting hervorragend geeignet. Zudem ist SQL*Plus auf jeder Oracle Installation verfügbar.
Die Syntax lautet wie folgt:

SQLPLUS [ [<option>] [<logon>] [<start>] ]

Dabei gelten folgende Parameter:

<option> ::= -H | -V | [ [-L] [-M <o>] [-R <n>] [-S] ]    
<logon>  ::= <username>[/<password>][@<connect_string>] | / | /NOLOG     
<start>  ::= @<URI>|<filename>[.<ext>] [<parameter> ...]       
"-H" zeigt SQL*Plus-Versions-Banner und Syntax von Verwendung an       
"-V" zeigt SQL*Plus-Versions-Banner an      
"-L" versucht eine einmalige Anmeldung       
"-M <o>" verwendet HTML-Markup-Optionen <o>       
"-R <n>" verwendet eingeschränkten Modus <n>       
"-S" verwendet Ton aus-Modus

Fertige SQL Scripte können mit dem Zeichen @ übergeben werden und sogar die Anmeldung an der Datenbank ist direkt möglich.
Ein Beispiel:

 sqlplus user/passwort@ORACLE_SID @datei.sql

Günstig Lion kaufen dank toom

Der Juli ist da und nal ehrlich. Wir warten alle auf OS X Lion.

Wenn die neuste Version von Apple’s Betriebsystem nun bald den Appstore sprengt, haben wir nun die Möglichkeit beim Kauf 20% zu sparen.

Denn unsere leiber REWE Discounter von nebenan, der toom Markt führt ab dem 04.07.2011 die 25€ iTunes Karte für nur 20€ im wöchentlichen Angebot.

Also zuschlagen, wird ja nicht schlecht.

Time Machine Backup mit Windows Home Server

Seit meinem Umzug auf OS X steht mein Acer H340 easystore NAS ziemlich sinnlos in der Ecke rum. Zeit das mal wieder zu ändern.

Wer den Acer nicht kennt: Der Acer easystore H340 ist eine NAS mit vorinstallierten Microsoft Windows Home Server.  Hardwareseitg bietet der Acer:

  • Intel Atom 230 CPU
  • 2GB DDR2 RAM
  • 4* SATA mit Hotswap Rahmen
  • e-SATA, USB
  • Gigabit Ethernet.

Alles in allem ein ganz brauchbares Paket, nett klein und im Betrieb auch sehr leise. Und das Ganze zu einem sehr günstigen Preis (aktuelles Modelle easystore H341).
Für nur 379€ bekommt man eine komplette NAS, eine vergleichbares Gerät von QNAP wie die TS-410   fängt erst bei 390€ an – aber ohne Festplatten. 
Der Windows Home Server stammt vom Windows Server 2003 ab. Natürlich wurden einige Funktionen wie der IIS oder das Active Directory stark beschränkt oder ganz wegelassen. Der Schwerpunkt liegt in diesen Geräten auf der einfachen Einbindung und Administration in einem Windows Netzwerk.

An dieser Stelle liegen auch die Schwachpunkte dieser NAS. Zwar kann man auf die Freigaben zugreifen, aber die Installation des Servers setzt ein Windows voraus. Die Anschließende Administartion kann dann aber über eine Remotedesktopverbindung erfolgen.

Der Andere Schwachpunkt des Servers liegt in dem Speichermanagement.
Um die Festplattenadministration zu erleichtern wurde bewusst auf ein herkömmliches RAID verzichtet. Statt dessen wurde erzeucgt der Schattenkopiedienst ein JBOD über alles Festplatten und erzeugt für die Dateien, die in entsprechenden Freigaben liegen, eine zusätzliche Kopie auf einem anderen Datenträger.
Dies erleichtert zwar das Vergrößern der NAS Kapazität, sorgt aber auch für einen Größeren Platzverbrauch.

Einrichten des Time Machine Backups

Zuerst brauchen wir ein Terminal. Die Änderungen die wir vornehmen müssen sind leider nicht über ein GUI erreichbar. Über den Menüpunkt  ”Gehe zu” kommt man direkt zu den Dienstprogrammen, von dort starten wir dann das Terminal.

Ändern der Voreinstellung in OS X

Normalerweise wird es von OSX unterbunden die Time Machine Backups auf normale Samba Shares zu sichern. Seitens Apple wird ja die Time Capsule angeboten, die dann Time Machine im Heimnetz anbietet.
Um nun diese Einschränkung auf zu heben geben wir im Terminal den Befehl

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

ein. Dadurch wird nun wenigsten im Time Machine Dialog die Netzwerklaufwerke angezeigt.

Erzeugen der Sparsebundle Datei

Leider hat es einen Grund, das solche Laufwerke eigentlich ausgeblendet sind. Denn das “unsupported” ist ernst zu nehmen. Nativ kann OS X dort nicht sichern. Nun müssen wir also das noch ermöglichen. Dazu legen wir jetzt lokal ein sparsebundle an. Dieses Bundle müssen wir mit dem Computernamen und der MAC Adresse der Netzwerkkarte benennen. Um die Macadresse heraus zu finden geben wir im Terminal ein:

ifconfig en0 | grep ether

Nun müssen wir das Sparsebundle erzeugen. Der Name der Datei muss lauten:

COMPUTERNAME_MACADRESSEOHNEDOPPLEPUNKT.sparsebundle

Nun erzeugen wir auf den Terminal mit dem Kommandozeilenprogramm hdiutil das sparsebundle mit dem Aufruf:

hdiutil create -size 1000g -fs HFS+J -volname "Time Machine" IMAC27_0f2c09101ac9.sparsebundle

Nun müssen wir die Datei nur noch auf das Netzwerklaufwerk verschieben:

mv IMAC27_0f2c09101ac9.sparsebundle   /Volumes/Backup

Einrichten in OS X

Nun können wir in der Time machine GUI das Netzwerklaufwerk auswählen: