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: 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: 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: 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;
/