Seiten

Freitag, 19. März 2010

Oracle: DROP TABLE OR SEQUENCE IF EXIST als Prozedur

CREATE OR REPLACE
PROCEDURE drop_object
(
ObjName IN VARCHAR2
) IS
counter  NUMBER := 0;
to_drp   VARCHAR2(200) := UPPER(ObjName);
drp_stmt VARCHAR2(200) := NULL;

BEGIN

  SELECT COUNT(*)
  INTO counter
  FROM user_tables
  WHERE table_name = to_drp;
  IF counter = 1
  THEN drp_stmt := 'Drop Table ' || to_drp;
  EXECUTE IMMEDIATE drp_stmt;
  END IF;

  SELECT COUNT(*) INTO counter
  FROM user_sequences
  WHERE sequence_name = to_drp;
  IF counter = 1 THEN
    drp_stmt := 'DROP SEQUENCE ' || to_drp;
    EXECUTE IMMEDIATE drp_stmt;
  END IF;

END DROP_OBJECT;
/

Der Aufruf der Prozedur könnte z.B. so erfolgen:

CALL drop_object('t_test');
CREATE TABLE t_test
(
  test_id NUMBER, uid_text VARCHAR2(80)
)

Oracle: LDAP ID als Primärschlüssel

CALL drop_object('t_test');
CREATE TABLE t_test (test_id NUMBER, uid_text VARCHAR2(80));

CREATE OR REPLACE TRIGGER insert_lid
BEFORE INSERT ON t_test FOR EACH ROW

DECLARE
l_ldap_host  VARCHAR2(256) := 'hera.leipzig.ufz.de';
l_ldap_port  VARCHAR2(256) := '389';
l_ldap_base  VARCHAR2(256) := 'dc=ufz,dc=de';
l_retval     PLS_INTEGER; 
l_session    DBMS_LDAP.session;
l_attrs      DBMS_LDAP.string_collection;
l_message    DBMS_LDAP.message;
l_entry      DBMS_LDAP.message;
l_vals       DBMS_LDAP.string_collection;

BEGIN    
l_session := DBMS_LDAP.init
(
  hostname => l_ldap_host,
  portnum  => l_ldap_port
);

l_retval := DBMS_LDAP.simple_bind_s
(
  ld     => l_session,
  dn     => NULL,
  passwd => NULL
);
                                      
l_attrs(0) := 'uidNumber'; 
l_retval := DBMS_LDAP.search_s
(
  ld       => l_session, 
  base     => l_ldap_base, 
  scope    => DBMS_LDAP.SCOPE_SUBTREE,
  filter   => '(&
                 (nsrole=*roleself*)
                 (objectClass=ufzperson)
                 (uid=' || :new.uid_text || ')
               )',
  attrs    => l_attrs,
  attronly => 0,
  res      => l_message
);   

IF DBMS_LDAP.count_entries
(
  ld => l_session,
  msg => l_message
) = 1
THEN
  l_entry := DBMS_LDAP.first_entry
  (
    ld  => l_session,
    msg => l_message
  );
                                                                                 
  l_vals := DBMS_LDAP.get_values
  (
    ld        => l_session,
    ldapentry => l_entry,
    attr      => l_attrs(0)
  );
END IF;                                     
  
DBMS_OUTPUT.PUT_LINE
(
  l_attrs(0) || ' = ' || l_vals(0)
);
  
l_retval := DBMS_LDAP.unbind_s
(
  ld => l_session
);
  
:new.test_id := l_vals(0);

END;
/

Der Trigger könnte z.B. so ausgelöst werden:

INSERT INTO t_test (uid_text)
VALUES ('dutzend');

Oracle: Per Trigger Website in CLOB einlesen

Die Tabelle für das Beispiel

CREATE TABLE t_pages
(
  pages_id NUMBER,
  url VARCHAR2(80),
  page CLOB
);

-- Sequenz für das Increment der ID
CREATE SEQUENCE t_pages_autoinc_seq
START WITH 1
INCREMENT BY 1
NOCACHE
NOMAXVALUE;

-- Trigger zum Aufruf der Sequenz
CREATE OR REPLACE TRIGGER t_pages_autoinc_trigger
BEFORE INSERT ON t_pages
FOR EACH ROW
BEGIN
  SELECT t_pages_autoinc_seq.NEXTVAL INTO :NEW.pages_id FROM DUAL; 
END;
/

Der Trigger löst folgendes aus:
Wird ein Datensatz mit einer gültigen URL eingefügt, wird die Seite aufgerufen und der HTML-Code der Seite in den CLOB geschrieben.

CREATE OR REPLACE TRIGGER insert_page
BEFORE INSERT ON t_pages
FOR EACH ROW

DECLARE 
  req  UTL_HTTP.req;
  resp UTL_HTTP.resp;
  page CLOB;

BEGIN    
  -- Verbindung aufbauen
  req := UTL_HTTP.begin_request(:new.url);
  -- Als Mozilla ausgeben
  UTL_HTTP.set_header(req, 'User-Agent', 'Mozilla/4.0');       

  resp := UTL_HTTP.get_response(req);    
  UTL_HTTP.read_text(resp, page, 50000);             
  UTL_HTTP.end_response(resp);    
  :new.page := page;  
   
EXCEPTION
  WHEN
    UTL_HTTP.end_of_body
  THEN
    UTL_HTTP.end_response(resp);
END;
/

Beispiel zum Aufrufen des Ganzen

INSERT INTO t_pages (url)
VALUES ('http://www.ufz.de/');

Oracle: LDAP Connection mi dem DBMS_LDAP Package

Im folgenden wird das DBMS_LDAP-Package genutzt um auf einen LDAP-Server anonym zuzugreifen und den Wert eines bestimmten Attributes zu lesen.
Konkret ist das hier die LDAP-ID (uidNumber) einer bestimmten Person (ufzperson).
Die ID der Person soll später als Primärschlüssel in einer Oracle-Tabelle genutzt werden.

DECLARE
l_ldap_host VARCHAR2(256) := 'hera.leipzig.ufz.de';
l_ldap_port VARCHAR2(256) := '389';  -- varchar?
l_ldap_base VARCHAR2(256) := 'dc=ufz,dc=de';

l_retval  PLS_INTEGER; 
l_session DBMS_LDAP.session;
l_attrs   DBMS_LDAP.string_collection;
l_message DBMS_LDAP.message;
l_entry   DBMS_LDAP.message;
l_vals    DBMS_LDAP.string_collection;  
    
BEGIN
l_session := DBMS_LDAP.init
(
  hostname => l_ldap_host,
  portnum  => l_ldap_port
);

-- anonym anmelden
l_retval := DBMS_LDAP.simple_bind_s
(
  ld     => l_session,
  dn     => NULL,
  passwd => NULL
);

-- Attribut welches gesucht wird                                      
l_attrs(0) := 'uidNumber'; 

-- Suche ausführen
l_retval := DBMS_LDAP.search_s
(
  ld       => l_session, 
  base     => l_ldap_base, 
  scope    => DBMS_LDAP.SCOPE_SUBTREE,
  filter   => '(&(nsrole=*roleself*)(objectClass=ufzperson)(uid=dutzend))',
  attrs    => l_attrs,
  attronly => 0,
  res      => l_message);  
 
-- Wenn genau ein Eintrag gefunden wurde
IF DBMS_LDAP.count_entries(ld => l_session, msg => l_message) = 1
THEN
  -- ersten Eintrag festlegen
  l_entry := DBMS_LDAP.first_entry
  (
    ld  => l_session,
    msg => l_message
  );
  
  -- Wert des Eintrages holen                                         
  l_vals := DBMS_LDAP.get_values
  (
    ld        => l_session,
    ldapentry => l_entry,
    attr      => l_attrs(0)
  );
END IF;                                     

-- Attribut und Wert ausgeben  
DBMS_OUTPUT.PUT_LINE(l_attrs(0) || ' = ' || l_vals(0));

-- Verbindung beenden  
l_retval := DBMS_LDAP.unbind_s(ld => l_session);
END;
/

Dienstag, 16. März 2010

Linux/Solaris: Dateiname in Textdateien einfügen

Um den jeweiligen Dateinamen in die 2. Zeile aller Textdateien einzufügen, die in einem Verzeichnis liegen, kann man folgende Befehlszeile im verwenden:

for i in *.*; do sed -i "2i\\$i" $i; done

Freitag, 12. März 2010

Linux/Solaris: Text in Dateien einfügen

  1. Terminal öffnen
  2. in den Ordner mit den Dateien wechseln (cd)
  3. sed -i "1i\Text in Zeile 1" *.mop
  4. sed -i "2i\Text in Zeile 2" *.mop

Donnerstag, 11. März 2010

Windows 7: Test auf Unterstützung des TRIM-Befehls

fsutil behavior query disabledeletenotify

Die Meldung DisableDeleteNotify = 0 bedeutet in diesem Fall die Aktierung von Trim, eine DisableDeleteNotify = 1 würde seine Deaktivierung signalisieren.

Dienstag, 9. März 2010

COMA: Linkicons und Glossarlinks setzen

Um z.B. in AJAX-Responses nachträglich die Glossarlinks und Linkicons zu setzen, kann man nachfolgende COMA-Funktion nutzen:
$html = "HTML mit Glossarbegriffen und Hyperlinks";
$root_pid = 28;
$html = linkicon_glossar_parser($html, $root_pid); 
Der Parameter $root_pid entscheidet über das Setzen der Glossarlinks (Knoten 1 JA, Knoten 9 NEIN ?).

Zu ersetzende Linkicons müssen in einem DIV mit der ID content stehen (nicht valide da ID dann doppelt)!

COMA: Makroparser aufrufen

Um z.B. Makros in AJAX-Responses zu parsen, kann man nachfolgende COMA-Funktion nutzen:
$html = "HTML mit einem Makro (§fgetpic_9908§)";
$html = ersetze_funktionstemplates
        (
          $conn, $sprache, $code, $html,
          $baum, $adm, $su, $pub
        );

Montag, 8. März 2010

USB Stick ohne Floppy bootfähig machen

Man braucht für diese Methode eigentlich eine startfähige Diskette im Laufwerk, als Ersatz kann man Virtual Floppy Drive verwenden.
  1. ZIP-Datei an beliebiger Stelle entpacken
  2. VFDWIN.EXE als Administrator starten
  3. unter Driver auf Start klicken
  4. bei Drive 0 oder Drive 1 mittels Change den Laufwerksbuchstaben auf A setzen
  5. Open und dann Create klicken (Image File bleibt leer)
  6. im Explorer den Arbeitsplatz öffnen
  7. Rechtsklick auf 3½-Diskette A - Formatieren - MS-DOS Startdiskette erstellen

Systemdateien auf den Stick übertragen

  1. HP USB Disk Storage Format Tool installieren
  2. USB Stick einstecken
  3. HP Tool starten
  4. Bei Device den Stick wählen
  5. Häkchen bei Create DOS Startup Diskusing DOS System Files located at A:\ machen

Mittwoch, 3. März 2010

COMA: Cron-Job einrichten

Als erstes erstellt man das Makro, welches per Cron aufgerufen werden soll.
Danach sucht man sich in der Datenbank die Tabelle W_CJ.
In die Spalte CJ_FKT trägt man den Namen des Makros ein.
Der Eintrag in die Spalte CJ_EXE besteht aus 4 Ziffern, die ersten beiden geben die volle Stunde an, in der das Makro gestartet wird (00 - 23).
Die beiden letzten stehen für den Tag im Monat an dem man das Makro ausführen möchte (01 - 31), 00 steht dabei für täglich.
In der Spalte CJ_LAST_EXE wird das Datum gesetzt an dem der Job zum letzten Mal ausgeführt wurde.