Kulcsszavak mint oszlopnevek Oracle alatt
2008. augusztus 6., szerda by Zoltan Tanczos
A migráció kapcsán rögtön belefutottunk egy érdekes problémába: SQL Server oldalon több olyan oszlopnevet is használunk, ami Oracle alatt kulcsszó vagy fenntartott szó: name, text, comment, date, number, stb.
Úgy gondoltuk, hogy ha ezeket az oszlopneveket nagybetűsen és ""-k között hozzuk létre (és így is hivatkozunk rájuk) akkor működhet. A táblák létre is jöttek, viszont több esetben egyéb gondok léptek fel. Pl.:
CREATE TABLE asdf (
"DATE" date
);
Select * from asdf;
Ez tökéletesen lefut, viszont:
declare
v_temp number;
begin
select 1 into v_temp from dual where exists (select 1 from asdf);
end;
ez már nem:
ORA-06550: line 5, column 61:
PL/SQL: ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 5, column 2:
Gondoltuk, hogy baj van, akkor át kell nevezni az oszlopokat. Elkezdtem próbálkozni, hogy milyen kulcsszavakkal van még gond, és nem az összes reserved word-del van baja:
CREATE TABLE asdf (
"AUDIT" date
);
Elvileg az audit is reserved word mégsem fut hibára a fenti kódrészlet.
A következő gondolat az volt, hogy a típusnevekkel van csak gondja, de ez sem teljesen igaz, ugyanis a lenti esetben:
CREATE TABLE asdf (
"DATE" int
);
Szintén hiba nélkül lefut a PL/SQL kód, ellenben, ha "NUMBER" int van (tehát nem "NUMBER" number), akkor megint csak az említett hibára fut.
Maradt még egy utolsó kombináció, méghozzá a kulcsszavak kisbetűsen, ""-k között:
CREATE TABLE asdf (
"number" number
);
Így jelenleg minden (date, number, stb.) működik. Egyelőre. Már csak az a költői kérdés maradt hátra, hogy ebben így mi a logika?
Úgy gondoltuk, hogy ha ezeket az oszlopneveket nagybetűsen és ""-k között hozzuk létre (és így is hivatkozunk rájuk) akkor működhet. A táblák létre is jöttek, viszont több esetben egyéb gondok léptek fel. Pl.:
CREATE TABLE asdf (
"DATE" date
);
Select * from asdf;
Ez tökéletesen lefut, viszont:
declare
v_temp number;
begin
select 1 into v_temp from dual where exists (select 1 from asdf);
end;
ez már nem:
ORA-06550: line 5, column 61:
PL/SQL: ORA-06552: PL/SQL: Compilation unit analysis terminated
ORA-06553: PLS-320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 5, column 2:
Gondoltuk, hogy baj van, akkor át kell nevezni az oszlopokat. Elkezdtem próbálkozni, hogy milyen kulcsszavakkal van még gond, és nem az összes reserved word-del van baja:
CREATE TABLE asdf (
"AUDIT" date
);
Elvileg az audit is reserved word mégsem fut hibára a fenti kódrészlet.
A következő gondolat az volt, hogy a típusnevekkel van csak gondja, de ez sem teljesen igaz, ugyanis a lenti esetben:
CREATE TABLE asdf (
"DATE" int
);
Szintén hiba nélkül lefut a PL/SQL kód, ellenben, ha "NUMBER" int van (tehát nem "NUMBER" number), akkor megint csak az említett hibára fut.
Maradt még egy utolsó kombináció, méghozzá a kulcsszavak kisbetűsen, ""-k között:
CREATE TABLE asdf (
"number" number
);
Így jelenleg minden (date, number, stb.) működik. Egyelőre. Már csak az a költői kérdés maradt hátra, hogy ebben így mi a logika?