Posts mit dem Label Oracle werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Oracle werden angezeigt. Alle Posts anzeigen

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');

Sonntag, 28. Februar 2010

Oracle: Autoincrement Workarounds

Da ORACLE den z.B. aus MySQL bekannten Datentyp auto_increment nicht kennt, nachfolgend zwei Möglichkeiten das auch in Oracle zu ermöglichen.

Tabelle für die Beispiele


create table teach_clients
(
id_clients number not null,
vorname varchar2(255),
zuname varchar2(255) not null,
geburtsdatum date,
constraint teach_clients_pk primary key
(
id_clients
)
enable
)

Unterabfrage mit Aggregatfunktion


insert into teach_clients
values
(
(
select
case
when max(id_clients) >= 1
then to_char(max(id_clients) + 1)
else to_char(1)
end
from teach_clients
),
'René',
'Tuchscherer',
'10.02.1963'
)

Trigger und Sequenz

Man erzeugt zwei zusätzliche Datenbankobjekte, eine Sequence und einen Trigger. Die Sequenz erzeugt die einzusetzenden Werte, der before-insert Trigger sorgt dafür, dass der neue Wert als erstes in der neuen Zeile landet.

-- die Sequenz erzeugen
create sequence id_clients_seq
start with 1
increment by 1
nomaxvalue;

-- den Trigger erzeugen
create trigger id_clients_trigger
before insert on teach_clients
for each row
begin
select id_clients_seq.nextval
into :new.id_client
from dual;
end;
Man kann statt start with 1 auch eine andere Zahl einsetzen, mit der begonnen werden soll.Das increment by 1 kann man eigentlich weglassen, weil es die Default-Einstellung ist.Der Parameter nomaxvalue sagt der Sequence, das sie für immer und ewig zu inkrementieren hat und nicht an irgendeinem Wert ein Reset machen soll.

Es kann übrigens durchaus sein, dass Zahlen "übersprungen" werden, weil sie von Oracle im Cache gehalten werden, um die Eindeutigkeit zu sichern. Wenn man also lückenlos aufsteigende Nummern haben muss, wäre dieser Ansatz nicht ausreichend.

Oracle: Autoincrement Workarounds

Da ORACLE den z.B. aus MySQL bekannten Datentyp auto_increment nicht kennt, nachfolgend zwei Möglichkeiten das auch in Oracle zu ermöglichen.

Tabelle für die Beispiele


create table teach_clients
(
id_clients number not null,
vorname varchar2(255),
zuname varchar2(255) not null,
geburtsdatum date,
constraint teach_clients_pk primary key
(
id_clients
)
enable
)

Unterabfrage mit Aggregatfunktion


insert into teach_clients
values
(
(
select
case
when max(id_clients) >= 1
then to_char(max(id_clients) + 1)
else to_char(1)
end
from teach_clients
),
'René',
'Tuchscherer',
'10.02.1963'
)

Trigger und Sequenz

Man erzeugt zwei zusätzliche Datenbankobjekte, eine Sequence und einen Trigger. Die Sequenz erzeugt die einzusetzenden Werte, der before-insert Trigger sorgt dafür, dass der neue Wert als erstes in der neuen Zeile landet.

-- die Sequenz erzeugen
create sequence id_clients_seq
start with 1
increment by 1
nomaxvalue;

-- den Trigger erzeugen
create trigger id_clients_trigger
before insert on teach_clients
for each row
begin
select id_clients_seq.nextval
into :new.id_client
from dual;
end;
Man kann statt start with 1 auch eine andere Zahl einsetzen, mit der begonnen werden soll.Das increment by 1 kann man eigentlich weglassen, weil es die Default-Einstellung ist.Der Parameter nomaxvalue sagt der Sequence, das sie für immer und ewig zu inkrementieren hat und nicht an irgendeinem Wert ein Reset machen soll.

Es kann übrigens durchaus sein, dass Zahlen "übersprungen" werden, weil sie von Oracle im Cache gehalten werden, um die Eindeutigkeit zu sichern. Wenn man also lückenlos aufsteigende Nummern haben muss, wäre dieser Ansatz nicht ausreichend.

Mittwoch, 20. Januar 2010

COMA: Angemeldeten User ermitteln


SELECT a.lid, b.login_name FROM web.wsess a, web.wlogin b WHERE sid = $sess_id AND a.lid = b.lid

COMA: Angemeldeten User ermitteln


SELECT a.lid, b.login_name FROM web.wsess a, web.wlogin b WHERE sid = $sess_id AND a.lid = b.lid

Oracle: Password ändern


ALTER USER name IDENTIFIED BY "password";

Oracle: Password ändern


ALTER USER name IDENTIFIED BY "password";

Dienstag, 19. Januar 2010

COMA: Oracle-Blob als Image-Stream

Hier als Makro umgesetzt, welches z.B. so aufgerufen wird:
[§fpicStream_13404§]
Als Parameter wird die gewünschte Bild-ID übergeben.


function picStream($conn, $param) {

if(isset($_REQUEST['getpic']) &&
is_numeric($param)) {

$sql = "select pics_blob from web.wpics
where pics_id=$param";
$stmt = OCIparse($conn, $sql) ;
OCIExecute($stmt,OCI_DEFAULT) ;
$check = OCIFetchInto($stmt, $row, OCI_ASSOC);
if($check == 1)
echo $row["PICS_BLOB"]->load();
}
else {
return "<img src=\"{$_SERVER["REQUEST_URI"]}&getpic\">";
}
}

COMA: Oracle-Blob als Image-Stream

Hier als Makro umgesetzt, welches z.B. so aufgerufen wird:
[§fpicStream_13404§]
Als Parameter wird die gewünschte Bild-ID übergeben.


function picStream($conn, $param) {

if(isset($_REQUEST['getpic']) &&
is_numeric($param)) {

$sql = "select pics_blob from web.wpics
where pics_id=$param";
$stmt = OCIparse($conn, $sql) ;
OCIExecute($stmt,OCI_DEFAULT) ;
$check = OCIFetchInto($stmt, $row, OCI_ASSOC);
if($check == 1)
echo $row["PICS_BLOB"]->load();
}
else {
return "<img src=\"{$_SERVER["REQUEST_URI"]}&getpic\">";
}
}

Donnerstag, 14. Januar 2010

COMA: Oracle-Tabellen zwischen Instanzen kopieren

Mit den nachfolgenden SQL-Anweisungen lassen sich mit einem Tool wie dem SQLDeveloper, Tabellen zwischen zwei verschiedenen Oracle-Instanzen kopieren,gültige Verbindungen zu den Instanzen vorrausgesetzt.Ausgangspunkt im SQLDeveloper ist jeweils die Zielinstanz.

Beispiel 1: von SERVICE nach INTERNET


create table WEB.WTR_UFZ
as select * from WEB.WTR_UFZ@testsystem

Beispiel 2: von INTERNET nach SERVICE


create table WEB.WTR_UFZ
as select * from WEB.WTR_UFZ@internet

COMA: Oracle-Tabellen zwischen Instanzen kopieren

Mit den nachfolgenden SQL-Anweisungen lassen sich mit einem Tool wie dem SQLDeveloper, Tabellen zwischen zwei verschiedenen Oracle-Instanzen kopieren,gültige Verbindungen zu den Instanzen vorrausgesetzt.Ausgangspunkt im SQLDeveloper ist jeweils die Zielinstanz.

Beispiel 1: von SERVICE nach INTERNET


create table WEB.WTR_UFZ
as select * from WEB.WTR_UFZ@testsystem

Beispiel 2: von INTERNET nach SERVICE


create table WEB.WTR_UFZ
as select * from WEB.WTR_UFZ@internet