PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → Hors-sujet → Accès natif Oracle grâce à l'accès natif PostgreSQL (astuce)
Accès natif Oracle grâce à l'accès natif PostgreSQL (astuce)
Débuté par Philippe Pasquali, 27 mar. 2017 12:11 - 1 réponse
Membre enregistré
946 messages
Popularité : +102 (110 votes)
Posté le 27 mars 2017 - 12:11
Vous utilisez PostgreSQL comme base de données avec son l'accès natif et vous voulez accéder à des tables d'une base de données Oracle en utilisant les ordres hLit, hLitRecherche, hSupprime…

Pour cela il y a deux solutions :

1° Acheter l'accès natif Oracle
2° Utiliser l'accès natif PostgreSQL

Comment :

1°) Installer dans votre base PostgreSQL le « Foreign Data Wrapper » oracle_fdw. Télécharger la version qui correspond à votre architecture 32/64 bits et version de PostgreSQL à partir de l'adresse : https://github.com/laurenz/oracle_fdw/releases
Ouvrez le fichier zip. Copiez les fichiers
du répertoire dans
lib <installation PostgreSQL>\lib
share\extension <installation PostgreSQL>\share\extension
symbols <installation PostgreSQL>\symbols

2°) Ajoutez l'extension oracle_fdw à votre base de données en exécutant :
CREATE FOREIGN DATA WRAPPER oracle_fdw
HANDLER public.oracle_fdw_handler
VALIDATOR public.oracle_fdw_validator;

COMMENT ON FOREIGN DATA WRAPPER oracle_fdw
IS 'Oracle foreign data wrapper';


3°) Ajoutez le Foreign Server :
CREATE SERVER oracle_server
FOREIGN DATA WRAPPER oracle_fdw
OPTIONS (dbserver '<Oracle Name Server>');


- <oracle_server> sera le nom de votre foreign server
- <Oracle Name Server> est le nom du serveur sur lequel se situe la base de données Oracle (localhost si le serveur PostgreSQL est le même que le serveur Oracle)

4°) Donnez les droits à l'utilisateur PostgreSQL sur le foreign serveur :
GRANT USAGE ON FOREIGN SERVER oracle_server TO postgres;


5°) Créez le mapping sur la base de données Oracle :
CREATE USER MAPPING FOR postgres
SERVER oracle_server
OPTIONS (user '<utilisateur oracle>', password '<mot de passe de l'utilisateur oracle>');


6°) Dans votre base PostgreSQL créez un schéma pour le mapping Oracle :
CREATE SCHEMA <Nom du schéma PostgreSQL> AUTHORIZATION postgres;


7°) Importez votre schéma Oracle dans le shéma PostgreSQL:
IMPORT FOREIGN SCHEMA "<Nom du schéma Oracle>"
FROM SERVER oracle_server
INTO <Nom du schéma PostgreSQL>


8°) Pour que Windev puisse importer dans l'analyse, la structure d'une table Oracle, il faut passer par une astuce, car l'assistant d'importation ne vois pas les tables Oracle. Il suffit de créer dans PostgreSQL une vue dans le schéma public sur la table oracle.

CREATE OR REPLACE VIEW public.<nom de la vue> (<liste des noms de colonnes de la vue>)
AS SELECT <liste des noms de colonnes de la vue>
FROM <Nom du schéma PostgreSQL>.<nom de la table>;


9°) Vous pouvez maintenant lancer
- Nouveau fichier de données
- Utiliser des fichiers de données d'une base existante
- PostgreSQL Accessible via l'accès natif
- Définissez une connexion sur votre base ou prenez en une de déjà définie
- Accéder directement aux données dans leur format actuel
- Activez « Voir les vues »
- Sélectionnez votre vue

10°) Générez votre analyse

Exemple :
Soit la table Oracle

CREATE TABLE "PHIL"."UTILISATEURS"
( "NUM_MATRICULE" CHAR(16 BYTE) NOT NULL ENABLE,
"FLAG_ACTIF" NUMBER(*,0),
CONSTRAINT "UTILISATEURS_PK" PRIMARY KEY ("NUM_MATRICULE")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ;

Code Windev

HOuvre(ora_utilisateurs)
HLitPremier(ora_utilisateurs)
WHILE NOT HEnDehors(ora_utilisateurs)
Trace(ora_utilisateurs.num_matricule+TAB+ora_utilisateurs.flag_actif)
HLitSuivant(ora_utilisateurs)
END
HLitRecherchePremier(ora_utilisateurs,"num_matricule", "MAT-009")
IF HTrouve(ora_utilisateurs) THEN
HSupprime(ora_utilisateurs)
END
HRAZ(ora_utilisateurs)
ora_utilisateurs.num_matricule = "MAT-009"
ora_utilisateurs.flag_actif = False
HAjoute(ora_utilisateurs)


Testé sur
Windows Seven 64bits
Windev 20
PostgreSQL 9.6.1, compiled by Visual C++ build 1800, 64-bit
oracle_fdw-1.5.0-pg96-win64
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

Il existe un Foreign Data Wrapper ODBC_fdw (http://www.postgresonline.com/journal/archives/372-ODBC-FDW-now-supports-9.5-and-9.6.html) qui devrait permettre la même manip sur DB2 (AS400) mais je n'ai pas la possibilité de tester
Cette méthode ne permet surement pas de faire tout ce que permet l'accès natif Oracle mais elle est gratuite....
Posté le 29 mars 2017 - 00:19
WOW!

je ne sais pas si j'aurais jamais besoin de ça, mais en tout cas, bravo
et merci

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com


Le 3/27/2017 à 4:11 AM, Philippe Pasquali a écrit :
Vous utilisez PostgreSQL comme base de données avec son l'accès natif et
vous voulez accéder à des tables d'une base de données Oracle en
utilisant les ordres hLit, hLitRecherche, hSupprime…

Pour cela il y a deux solutions :

1° Acheter l'accès natif Oracle
2° Utiliser l'accès natif PostgreSQL

Comment :

1°) Installer dans votre base PostgreSQL le « Foreign Data Wrapper »
oracle_fdw. Télécharger la version qui correspond à votre architecture
32/64 bits et version de PostgreSQL à partir de l'adresse :
https://github.com/laurenz/oracle_fdw/releases Ouvrez le fichier zip.
Copiez les fichiers du répertoire dans
lib <installation PostgreSQL>\lib
share\extension <installation PostgreSQL>\share\extension
symbols <installation PostgreSQL>\symbols

2°) Ajoutez l'extension oracle_fdw à votre base de données en exécutant :
CREATE FOREIGN DATA WRAPPER oracle_fdw
HANDLER public.oracle_fdw_handler
VALIDATOR public.oracle_fdw_validator;

COMMENT ON FOREIGN DATA WRAPPER oracle_fdw
IS 'Oracle foreign data wrapper';


3°) Ajoutez le Foreign Server :
CREATE SERVER oracle_server FOREIGN DATA WRAPPER oracle_fdw OPTIONS
(dbserver '<Oracle Name Server>');


- <oracle_server> sera le nom de votre foreign server
- <Oracle Name Server> est le nom du serveur sur lequel se situe la base
de données Oracle (localhost si le serveur PostgreSQL est le même que le
serveur Oracle)

4°) Donnez les droits à l'utilisateur PostgreSQL sur le foreign serveur :
GRANT USAGE ON FOREIGN SERVER oracle_server TO postgres;


5°) Créez le mapping sur la base de données Oracle :
CREATE USER MAPPING FOR postgres SERVER oracle_server OPTIONS (user
'<utilisateur oracle>', password '<mot de passe de l'utilisateur oracle>');


6°) Dans votre base PostgreSQL créez un schéma pour le mapping Oracle :
CREATE SCHEMA <Nom du schéma PostgreSQL> AUTHORIZATION postgres;


7°) Importez votre schéma Oracle dans le shéma PostgreSQL:
IMPORT FOREIGN SCHEMA "<Nom du schéma Oracle>" FROM SERVER oracle_server
INTO <Nom du schéma PostgreSQL>


8°) Pour que Windev puisse importer dans l'analyse, la structure d'une
table Oracle, il faut passer par une astuce, car l'assistant
d'importation ne vois pas les tables Oracle. Il suffit de créer dans
PostgreSQL une vue dans le schéma public sur la table oracle.

CREATE OR REPLACE VIEW public.<nom de la vue> (<liste des noms de
colonnes de la vue>)
AS SELECT <liste des noms de colonnes de la vue>
FROM <Nom du schéma PostgreSQL>.<nom de la table>;


9°) Vous pouvez maintenant lancer - Nouveau fichier de données
- Utiliser des fichiers de données d'une base existante
- PostgreSQL Accessible via l'accès natif
- Définissez une connexion sur votre base ou prenez en une de déjà définie
- Accéder directement aux données dans leur format actuel
- Activez « Voir les vues »
- Sélectionnez votre vue

10°) Générez votre analyse

Exemple : Soit la table Oracle

CREATE TABLE "PHIL"."UTILISATEURS" ( "NUM_MATRICULE" CHAR(16 BYTE)
NOT NULL ENABLE, "FLAG_ACTIF" NUMBER(*,0), CONSTRAINT
"UTILISATEURS_PK" PRIMARY KEY ("NUM_MATRICULE")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ENABLE
) SEGMENT CREATION IMMEDIATE PCTFREE 10 PCTUSED 40 INITRANS 1
MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "SYSTEM" ;

Code Windev

HOuvre(ora_utilisateurs)
HLitPremier(ora_utilisateurs)
WHILE NOT HEnDehors(ora_utilisateurs)
Trace(ora_utilisateurs.num_matricule+TAB+ora_utilisateurs.flag_actif)
HLitSuivant(ora_utilisateurs)
END
HLitRecherchePremier(ora_utilisateurs,"num_matricule", "MAT-009")
IF HTrouve(ora_utilisateurs) THEN
HSupprime(ora_utilisateurs)
END
HRAZ(ora_utilisateurs)
ora_utilisateurs.num_matricule = "MAT-009"
ora_utilisateurs.flag_actif = False HAjoute(ora_utilisateurs)


Testé sur Windows Seven 64bits
Windev 20
PostgreSQL 9.6.1, compiled by Visual C++ build 1800, 64-bit
oracle_fdw-1.5.0-pg96-win64
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production

Il existe un Foreign Data Wrapper ODBC_fdw
(http://www.postgresonline.com/journal/archives/372-ODBC-FDW-now-supports-9.5-and-9.6.html)
qui devrait permettre la même manip sur DB2 (AS400) mais je n'ai pas la
possibilité de tester
Cette méthode ne permet surement pas de faire tout ce que permet l'accès
natif Oracle mais elle est gratuite....