Oracle SQL und die Bedeutung verschiedener Sonderzeichen
Quellenangabe: siehe unten
"Oracle SQL und die Bedeutung verschiedener Sonderzeichen
Momentan arbeite ich an einem etwas größerem Data-Warehouse Projekt und verwalte dort die SQL-Scripte. Dabei kommt es schon vor, dass verschiedene Sachen in die Datenbank eingefügt werden müssen. Letztens stolperte ich dabei über das folgende Phänomen:SQL> insert into temp_data(name, version) values ('A & P', 3);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', 3)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
col spoolfile new_value spoolfile
select '/tmp/logfile_'||to_char(sysdate,'yyyymmdd_HHMI') || '.txt' as spoolfile from dual;
spool &spoolfile
Bis hier ist es ok. Wie kann man jetzt ein '&' innerhalb eines Insert-Statements verwenden, obiges Statement funktioniert ja nicht? Man kann Oracle beibringen, dass es keine Variablen-Substitution machen soll. Dies geschieht über ein Set-Statement:
-- Ausschalten des Interpretierens von Variablennamen
-- Dadurch kann & innerhalb von SQL-Statements angegeben werden
set define off
SELECT * FROM testtab WHERE textfeld LIKE '%20@%%' ESCAPE '@';
Hiermit würde man alle Felder finden, in denen die Zeichenkette "20%" vorkommt, egal ob am Anfang oder mittendrin oder am Ende.
Das funktioniert nur leider eben nicht für Insert-Statements:
SQL> insert into temp_data(name,version) values ('A @& P' ESCAPE '@', 3);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', 3)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
col version new_value version
select versionsnr into version from versionstabelle where status='aktiv';
SQL> insert into temp_data(name,version) values ('A & P', &version);
Enter value for p: blah
old 1: insert into temp_data values ('A & P', &version)
new 1: insert into temp_data values ('A blah', 3)
1 row created.
col version new_value version
select versionsnr into version from versionstabelle where status='aktiv';
SQL> insert into temp_data(name,version) values ('A &'||' P', &version);
old 1: insert into temp_data values ('A & P', &version)
new 1: insert into temp_data values ('A & P', 3)
1 row created.
Disclaimer: alle obigen SQL-Statements sind aus meiner Erinnerung abgetippt. Sie sind evtl. nicht ganz syntaktisch korrekt, aber ich hab zuhause halt keine Oracle laufen und so muß ich mein Gedächtnis bemühen.
Ein Dank geht an "The Oracle (tm) Users' Co-Operative FAQ"
"
Quelle:
http://blog.256bit.org/archives/272-Oracle-SQL-und-die-Bedeutung-verschiedener-Sonderzeichen.html
Kommentare
Kommentar veröffentlichen