Thursday, May 27, 2010

Compilar PL/SQL des de l'Eclipse

Ara que tinc una aplicació que fa us intensiu d'Oracle PL/SQL i que també té Java haig d'anar canviant entre l'Eclipse i el que fan servir aquí per l'Oracle, el PL/SQL Developer. Com a més ara hem posat tot al Subversion (fins i tot el PL/SQL) i el PL/SQL Developer s'integra "d'aquella manera" fent servir el Tortoise SVN he vist la clara necessitat de fer-ho tot amb l'Eclipse.

Per poder-ho fer necessitava que Eclipse pogués compilar el PL/SQL. Les darreres versions (la 3.5 Galileo amb l'opció Eclipse IDE for Java EE Developers, per exemple) ja porten el Data Tools Platform per accedir a bases de dades, però Oracle ha fet un plugin propi que dóna millor suport per accedir a Oracle (a banda de fer altres coses amb el WebLogic). El plugin d'Oracle es pot instal·lar des del seu update-site: http://download.oracle.com/otn_software/oepe/galileo.

Tenim un altre problema afegit: la base de dades fa servir UTF-8. A l'hora d'exportar el PL/SQL de la BD el PL/SQL developer ens ha afegit uns caràcters estranys (EF BB BF) al començament del fitxer. Resulta que això és el Byte-Order Mark (BOM), una marca que indica l'ordre en el que van els Bytes (primer el petit o primer el gran, little-endian o big-endian) i que té mol sentit a UTF-16. No sé per què el PL/SQL Developer ha posat això. El cas és que en compilar has de treure aquests caràcters.

Ara que semblava que ja estava tot endreçat ens hem trobat que, en alguna ocasió, en compilar un package amb el caràcter interrogant ("?") l'havia substituït per dos punts i un número (com a :1), com si fos un placeholder per a variables. El text:
buf:= '< ?xml version="1.0" encoding="UTF-8"?>';
El convertia en:
buf:= '<:1xml version="1.0" encoding="UTF-8":2>';

I això ho feia només de vegades. No sabem si és el plugin o el driver JDBC.

M'he hagut de fer un muntatge per compilar el PL/SQL des de Eclipse, cridant al SQL*Plus com una External Tool. He definit una nova configuració d'eina externa apuntant a un BAT propi (tinc Windows XP), indicant-li el Working Directory el mateix on està el BAT i els paràmetres següents:
username/password@database ${selected_resource_loc}
Al BAT tinc el següent:
copy %2 _aux_.sql
call utf8bom -strip -file _aux_.sql
copy c:\atassani\sqlplus_bom\ini.txt+_aux_.sql+c:\atassani\sqlplus_bom\fin.txt _aux.sql
sqlplus %1 @_aux.sql
Al ini.txt tinc:
set define off
Al fin.txt tinc:
quit

Tots els meus fitxers de PL/SQL acaben en "/", tal i com els exporta el PL/SQL Developer.

La línea call utf8bom -strip -file _aux_.sql és l'encarregada d'eliminar el BOM, per què el sqlplus tampoc no sap manegar-lo. No he trobat cap manera fàcil d'eliminar el BOM de forma elegant i buscant per la xarxa tothom proposava que et fessis un programa. En un Linux es podria fer fàcilment amb un sed o un awk, però no al Windows. Per tenir una solució més portable m'he instal·lat el Perl i després el mòdul UTF8BOM tan fàcil com sempre al Perl:
perl -MCPAN -e "install UTF8BOM"

D'aquesta manera li treu el BOM només en el moment de compilar amb sqlplus.

Ara estic treballant en un altre script per que em pugui compilar un conjunt de fitxers PL/SQL, per exemple els que detecta subversion que he modificat.

No comments: