Még pár szó a konverziókról

A migrációval kapcsolatos előző bejegyzésben az implicit és explicit konverziókról is írtam pár gondolatot. Azóta észrevettem egy furcsaságot, amit fel is vetettem az OTN fórumban, de azóta nem kaptam rá választ.

Röviden összefoglalva: az SQL Developer SQL Serverről történő migrációkor automatikusan generál egy sqlserver_utilities nevű PL/SQL package-et, ami számos T-SQL függvény implementációját tartalmazza, köztük a CONVERT() függvényét is.

Az 1.5.1-es SQL Developerben a függvény deklarációja így néz ki:

FUNCTION convert_(p_dataType IN VARCHAR2, p_expr IN VARCHAR2, p_style IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2;

Az első paraméter szöveges módon tartalmazza az adattípust, hogy mire konvertálunk, például 'varchar'. A második paraméter maga a kifejezés, amit konvertálni szeretnénk, az utolsó pedig egy opcionális stílus paraméter, ami a különböző dátum, szám illetve egyéb formátumokat határozza meg, attól függően, hogy a konvertálandó kifejezés milyen típusú.

És itt jön elő az implicit konverzió kérdése, ugyanis ha egy dátum típusú kifejezést szeretnénk yyyy/mm/dd formátumú varchar-á konvertálni, ami T-SQL-ben így néz ki:

declare @mydate datetime
select convert(varchar, @mydate,111)

azt az sqlserver_utilities.convert_() függvény segítségével - elvileg - így tehetnénk meg:

DECLARE
cv_1 SYS_REFCURSOR;
v_mydate DATE;
BEGIN
OPEN cv_1 FOR
SELECT sqlserver_utilities.convert_('VARCHAR2(4000)', v_mydate, 111);

Ebben az esetben viszont a v_mydate először implicit módon varchar-á konvertálódik, méghozzá az alapértelmezett formátumnak megfelelően:

select value from v$NLS_PARAMETERS where parameter = 'NLS_DATE_FORMAT'

Ez nálam azzal jár, hogy elveszik minden idő jellemző (óra, perc, másodperc). Például a 108-as stílus (hh:mi:ss) a convert_() függvénnyel használhatatlan.

Ezek után már csak egy költői kérdés maradt hátra, hogy a függvény kódjában a 108-as stílushoz miért a HH12-as formátum tartozik, amikor SQL Server alatt a hh 24 órás megjelenítést jelent.

0 megjegyzés: