MS4W et Oracle Spatial

Même si en principe, l'installation et la configuration pour connecter un layer Oracle Spatial d'un mapfile est vraiment simple,  j'ai passé quelques jours dernièrement à chercher une erreur de configuration un peu stupide!  J'ai cru bon en faire un résumé en lien avec la documentation Mapserver sur le sujet.

À mon avis, la façon la plus simple d'utiliser MS4W avec Oracle Spatial sur votre Windows, est d’utiliser le Instant Client basic light.  Pas besoin de polluer votre setup avec la grosse installation du client complet.  La procédure qui suit montre comment créer à partir de zéro  1) une table avec un champ SDO_GEOMETRY sur Oracle, 2) l’enregistrer dans le catalogue Oracle, 3) installer le client Oracle, 4) créer le mapfile et 5) des astuces pour tester votre config.

Chargement d'un jeux de données test

Il sera très utile d'avoir un jeux de données testes sur votre serveur Oracle.  J'utilise régulièrement ce script pour charger des données rapidement et sans effort.

Installer le InstantClient Oracle

0) Le package MS4W est un build 32bit.  Il est très important de télécharger le InstantClient-basiclight 32bits sur le site d’Oracle même si votre serveur Windows est de type 64bit.   Pour installer le client Oracle, simplement décompresser le fichier et placer dans le répertoire de son choix.  Pour cet exemple utilisons:

 c:instantclient_11_2

1) Il est IMPÉRATIF de placer ce répertoire dans la Variable d’Environnement  PATH du système.  C’est la SEULE variable d’environnement que vous devez configurer.   Les variables ORACLE_HOME, ORACLE_BASE, TNS_ADMIN, ORACLE_SID ou LD_LIBRARY_PATH ne sont pas requises pour MS4W.

2)  On doit déplacer le fichier libmap.dll dans le répertoire cgi-bin de Apache et le fichier ogr_OCI.dll dans le répertoire de gdalplusgins.  NOTE: Il serait préférable d’arrêter le service MS4W Apache sur votre serveur s’il est déjà en route avant de faire la copie des fichiers:

c:ms4wApachecgi-binignored-libmaporacle11glibmap.dll --> c:ms4wApachecgi-bin
c:ms4wgdalpluginsignoredoracle-11gogr_OCI.dll --> c:ms4wgdalplugins
Ne reste plus qu’à redémarrer Apache via un Prompt DOS ou dans le gestionnaire de services Windows: c:ms4wapache-restart
IMPORTANT:

Je suggère ici de vous assurer que le PATH contient bien votre répertoire du client Oracle.  On peut regarder dans un Prompt DOS avec la commande set mais vous devez aussi vérifier qu’elle sera aussi disponible dans Apache.  Vous pouvez valider avec la commande phpinfo.php.  On doit trouver à la rubrique “Environment” la valeur de la variable PATH qui doit inclure le répertoire du client Oracle.  Il se peut très bien que la valeur de PATH du système Windows ne soit pas la même dans Apache et dans DOS.

ogrinfo

Avant de faire des essais avec Mapserver, il est fortement recommandé de tester la connexion Oracle avec ogrinfo parce que moins de composantes sont requises.  J'utilise une connexion sans TNSNAMES.ORA parce que c'est plus propre et plus simple.  Ouvrir un Prompt Dos et faire les commandes suivantes: 

C:ms4w>setenv
C:ms4w>set PATH=C:instantclient_11_2;%PATH%
C:ms4w>ogrinfo OCI:user/pw@my_serveur_name_or_ip:port/my_sid_db_name
-----
INFO: Open of `OCI:user/pw@my_serveur_name_or_ip/my_sid_db_name'
using driver `OCI' successful.
1: ZZ_EOLIENNES_P
2: ZZ_VILLE_S 
IMPORTANT:

En cas de problème, utiliser cette astuce pour avoir un log complet des problèmes potentiels.

C:ms4w>set CPL_DEBUG=on
C:ms4w>ogrinfo OCI:user/pw@my_server_name_or_ip:port/my_sid_db_name

mapfile

J'ai ici mon layer très simple pour me connecter à Oracle.
   LAYER
     NAME "zz_ville_s"
     TYPE POLYGON
     CONNECTIONTYPE oraclespatial
     CONNECTION "user/pw@my_server_name_or_ip:port/my_sid_db_name"
     DATA "GEOM FROM (SELECT geom FROM ZZ_VILLE_S)"
     PROCESSING "CLOSE_CONNECTION=DEFER"
     CLASS
       NAME "Ville"
       STYLE
         COLOR 25 200 20
         OUTLINECOLOR 80 80 80
       END
     END
   END

shp2img

Par la suite on peut produire un mapfile très très simple pour tester un layer Oracle.   Encore une fois on peut essayer avec l’utilitaire shp2img qui a l’avantage de ne pas passer par la composante Apache.  Ça peut être fort utile pour débuger un service qui ne veut pas démarrer.

C:ms4w>setenv
C:ms4w>set PATH=C:instantclient_11_2;%PATH%
C:ms4w>shp2img -m C:/view-oracle2.map -i png -o C:/temp/test-oracle.png -map_debug 5 -e -67.7 48.7 -67.5 48.8 -l ZZ_VILLE_S
----------
msDrawMap(): rendering using outputformat named png (AGG/PNG).
msDrawMap(): WMS/WFS set-up and query, 0.000s
msDrawMap(): Layer 0 (ZZ_EOLIENNES_P), 0.674s
msDrawMap(): Drawing Label Cache, 0.000s
msDrawMap() total time: 0.677s
msSaveImage(C:/temp/test-oracle.png) total time: 0.079s
msFreeMap(): freeing map at 020BC200.

mapserv via Apache

Sous Windows avec MS4W, il n’y a pas vraiment de configuration à faire.  Le fait d’ajouter dans la Variable d’Environnement PATH, le répertoire du client Oracle ferra en sorte que  celle-ci se retrouvera dans la Variable d’Environnement PATH de Apache.

http://127.0.0.1/cgi-bin/mapserv.exe?map=C:/view-oracle2.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=ZZ_VILLE_S&STYLES=&SRS=EPSG:4326&BBOX=-67.7,48.7,-67.5,48.8&WIDTH=400&HEIGHT=300&FORMAT=image/png

mapserv via commande DOS

Autre astuce, on peut aussi utiliser la commande mapserv pour tester la URL avec l'option QUERY_STRING.

C:ms4w>setenv
C:ms4w>set PATH=C:instantclient_11_2;%PATH%
C:ms4w>mapserv “QUERY_STRING=map=C:/view-oracle2.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=ZZ_VILLE_S&STYLES=&SRS=EPSG:4326&BBOX=-67.7,48.7,-67.5,48.8&WIDTH=400&HEIGHT=300&FORMAT=image/png”
Simon Mercier (smercier at mapgears.com)

Script SQL Oracle Spatial – Chargement données test

Ce script très simple de chargement de données test, permettra de démarrer rapidement avec Oracle Spatial. Je l'utilise régulièrement pour développer, tester certaines requêtes ou procédures et pour ce blog.  Les données test sont des points d'éoliennes (ZZ_EOLIENNES_P) liés par une Foreign key à une surface ville (ZZ_VILLE_S)
-- #########################################
-- Table ZZ_EOLIENNES_P

CREATE TABLE ZZ_EOLIENNES_P
(
 EOLIENNES_ID NUMBER(10),
 VILLE_ID NUMBER(10),
 DESC_ VARCHAR2(200),
 GEOM MDSYS.SDO_GEOMETRY
);
ALTER TABLE ZZ_EOLIENNES_P  ADD (CONSTRAINT ZZ_EOLIENNES_P_PK PRIMARY KEY (EOLIENNES_ID));

INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)VALUES ('ZZ_EOLIENNES_P', 'GEOM', MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',-83,-54, 0.000005),MDSYS.SDO_DIM_ELEMENT('Y',43, 63,0.000005)),4326);

DROP INDEX ZZ_EOLIENNES_P_IS;
CREATE INDEX ZZ_EOLIENNES_P_IS ON ZZ_EOLIENNES_P("GEOM") INDEXTYPE IS MDSYS.SPATIAL_INDEX;

-- Options possibles
-- PARAMETERS (' geodetic=false layer_gtype=COLLECTION SDO_COMMIT_INTERVAL=100 tablespace=MY_TABLE_SPACE INITIAL=200K NEXT=64K MINEXTENTS=1 MAXEXTENTS=200 PCTINCREASE=0');

-- Ajout de quelques données
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (0, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59743928909302,48.79196964612326,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (1, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59743928909302,48.79196964612326 ,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (2, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59606599807739,48.79290616097424 ,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (3, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59743928909302,48.79196964612326 ,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (4, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59836196899414,48.79070090566935,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (5, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59883940219879,48.789729007576526,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (6, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.59963870048523,48.78895854407517,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (7, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.60334014892578,48.78498940933159,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (8, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.60491728782654,48.784289564951145,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (9, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.6097023487091,48.78265655677682,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (10, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.61019051074982,48.781429998379544,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (11, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.6094663143158,48.78035187474781,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (12, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.60951459407806,48.77851370892812,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (13, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.61433720588684,48.77799406138623,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (14, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.6143479347229,48.77916414452893,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (15, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.61436402797699,48.78015038677945,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (15, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.69213199615479,48.76361501275503,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (16, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.69311904907227,48.76106899360166,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (17, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.69861221313477,48.759909097641696,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (18, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.69869804382324,48.7569809484446,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (19, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.69979238510132,48.75425068455974,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (20, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.70485639572144,48.75188810849875,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (21, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.7077317237854,48.74953956949669,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (22, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.71073579788208,48.74755878862284,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (23, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.71384716033936,48.74552133255116,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (24, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.7171516418457,48.740667892655736,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (25, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.72170066833496,48.74253574424521,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (26, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.72356748580933,48.745761869860054,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (27, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.73457527160645,48.75017623248125,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (28, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.73459672927856,48.75318966115,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (29, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.74504661560059,48.75215691017849,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (30, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.73092746734619,48.755467297157985,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (31, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.72560596466064,48.75379798397896,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (32, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.72288084030151,48.758805757115624,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (33, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.72876024246216,48.773232142600904,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (34, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.72545576095581,48.771464426020316,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (35, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.7218508720398,48.76937136911909,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (36, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.71783828735352,48.76710850675318,NULL), NULL, NULL));
INSERT INTO ZZ_EOLIENNES_P (EOLIENNES_ID, GEOM) VALUES (37, SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(-67.71483421325684,48.76515670605726,NULL), NULL, NULL));

SELECT count(*) from ZZ_EOLIENNES_P;
------
-- 38 rec

-- #########################################
--Table VILLE_S
DROP TABLE ZZ_VILLE_S;
CREATE TABLE ZZ_VILLE_S
(
 VILLE_ID NUMBER(10),
 NOM VARCHAR2(200),
 GEOM MDSYS.SDO_GEOMETRY
);
ALTER TABLE ZZ_VILLE_S ADD (CONSTRAINT VILLE_S_PK PRIMARY KEY (VILLE_ID));

INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)VALUES ('ZZ_VILLE_S', 'GEOM', MDSYS.SDO_DIM_ARRAY(MDSYS.SDO_DIM_ELEMENT('X',-83,-54, 0.000005),MDSYS.SDO_DIM_ELEMENT('Y',43, 63,0.000005)),4326);

DROP INDEX VILLE_S_IS;
CREATE INDEX ZZ_VILLE_S_IS ON ZZ_VILLE_S("GEOM") INDEXTYPE IS MDSYS.SPATIAL_INDEX ;
--Options possibles
-- PARAMETERS (' geodetic=false layer_gtype=POLYGONE SDO_COMMIT_INTERVAL=100 tablespace=MY_TABLESPACE INITIAL=200K NEXT=64K MINEXTENTS=1 MAXEXTENTS=200 PCTINCREASE=0')

-- Ajout de quelques données
INSERT INTO ZZ_VILLE_S VALUES(10, 'polygon_sud',  SDO_GEOMETRY( 2003, 4326, NULL,
                                              SDO_ELEM_INFO_ARRAY(1,1003,1),
                                            SDO_ORDINATE_ARRAY(-67.75,48.739,-67.596,48.739, -67.596,48.760,-67.750,48.760,-67.75,48.739)));
INSERT INTO ZZ_VILLE_S VALUES(20, 'polygon_nord',  SDO_GEOMETRY( 2003, 4326, NULL,
                                              SDO_ELEM_INFO_ARRAY(1,1003,1),
                                            SDO_ORDINATE_ARRAY(-67.750,48.760,-67.596,48.760,-67.596,48.793,-67.750,48.793,-67.750,48.760)));

SELECT count(*) from ZZ_VILLE_S;
------
-- 2 rec

-- #########################################
-- Test requêtes spatiales Licence Oracle Locator

SELECT p.EOLIENNES_ID,v.NOM FROM ZZ_EOLIENNES_P p, ZZ_VILLE_S v
WHERE SDO_RELATE(v.GEOM, p.GEOM, 'mask=anyinteract  querytype=window') = 'TRUE'
AND v.VILLE_ID=10;
------
--16 rec

SELECT p.EOLIENNES_ID,v.NOM FROM ZZ_EOLIENNES_P p, ZZ_VILLE_S v
WHERE SDO_RELATE(v.GEOM, p.GEOM, 'mask=anyinteract  querytype=window') = 'TRUE'
AND v.VILLE_ID=20;
------
--22 rec

-- retourner les 7 points les plus proche de lat/long spécifique
SELECT e.EOLIENNES_ID
FROM ZZ_EOLIENNES_P e
WHERE SDO_NN(e.geom,mdsys.sdo_geometry(2001, 4326,
mdsys.sdo_point_type(-67.530932 ,48.843439,NULL), NULL,
   NULL),  'sdo_num_res=7') = 'TRUE';

-- Générer un buffer de 1 kilomètre autour des eoliennes.
SELECT e.EOLIENNES_ID, SDO_GEOM.SDO_BUFFER(e.GEOM, m.diminfo, 1, 'unit=km arc_tolerance=0.05')
 FROM ZZ_EOLIENNES_P e, user_sdo_geom_metadata m
 WHERE m.table_name = 'ZZ_EOLIENNES_P'
 AND m.column_name = 'GEOM';

-- #########################################
-- Appliquer un Foreign Key aux EOLIENNES_P vs la ville

UPDATE ZZ_EOLIENNES_P SET VILLE_ID=10 WHERE eoliennes_id IN (
SELECT p.eoliennes_id FROM ZZ_EOLIENNES_P p, ZZ_VILLE_S v
WHERE SDO_RELATE(v.GEOM, p.GEOM, 'mask=anyinteract  querytype=window') = 'TRUE'
AND v.VILLE_ID=10);
---
--16 lignes mises à jour

UPDATE ZZ_EOLIENNES_P SET VILLE_ID=20 WHERE eoliennes_id IN (
SELECT p.eoliennes_id FROM ZZ_EOLIENNES_P p, ZZ_VILLE_S v
WHERE SDO_RELATE(v.GEOM, p.GEOM, 'mask=anyinteract  querytype=window') = 'TRUE'
AND v.VILLE_ID=20);
---
--22 lignes mises à jour

ALTER TABLE ZZ_EOLIENNES_P ADD
      CONSTRAINT ZZ_EOLIENNES_P_FK
      FOREIGN KEY (VILLE_ID)
      REFERENCES ZZ_VILLE_S(VILLE_ID)
      ON DELETE CASCADE;

Oracle NSL_LANG variable

Vous utilisez Apache comme moteur Web avec Mapserver ou GeoServer et vous voulez avez des problèmes d'accents dans votre application. 1) Identifier votre encodage de BD; SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET' or PARAMETER = 'NLS_LANGUAGE'; ------------------------------------------------- PARAMETER VALUE NLS_LANGUAGE CANADIAN FRENCH NLS_CHARACTERSET WE8ISO8859P1 2) Identifier votre code de langue http://download.oracle.com/docs/cd/A84870_01/doc/nt.816/a73010/appc.htm Dans mon cas il sera: "CANADIAN FRENCH_CANADA.WE8ISO8859P1" 3) On peut spécifier ce code dans une variable d'environnement sur le serveur export NLS_LANG="CANADIAN FRENCH_CANADA.WE8ISO8859P1" ou l'ajouter dans le profile de tous les user sudo vim /etc/profile 4) Spécifier votre encodage de langue Oracle correctement dans Apache On doit placer une variable d'environnement dans le fichier de configuration d'Apache. Attention, cette conf NE DOIT PAS être placée dans un balise <VirtualHost> </VirtualHost> ... sudo vim /etc/apache2/httpd.conf ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory /usr/lib/cgi-bin/ >    AllowOverride None    Options ExecCGI -MultiViews +SymLinksIfOwnerMatch    Order allow,deny    Allow from all </Directory> #spécifier le client Oracle et la langue <Location "/cgi-bin/">    SetEnv ORACLE_HOME "/opt/oracle/clients/10.2.0.1"    SetEnv NLS_LANG "CANADIAN FRENCH_CANADA.WE8ISO8859P1" </Location> #Rep temp pour mapserver Alias /ms_tmp/ "/var/www/ms_tmp/" <Directory "/var/www/ms_tmp/">    Options Indexes MultiViews FollowSymLinks    AllowOverride None    Order allow,deny    Allow from all </Directory>

Rownum dans Postgresql

Dans Oracle ceux qui ont l'habitude d'utiliser l'option rownum pour limiter le nombre de résultat d'une requête SQL pourront retrouver le même effet avec l'option limit dans Postgresql select no_appart from immeubles_p where rownum select no_appart from immeubles_p limit 10; no_appart ----------- 25 703 543 204 14 234 890 27 184 765 (10 rows) ------------------------------------------------------------