Prérequis pour la connexion à la base distante : le listener Oracle doit être démarré et paramétré pour les bases source et cible.
Création d'un database link vers la base éloignée
Sur la base locale, la base éloignée ayant le code "DIST",
create database link BASE_DIST connect to HR identified by ** using 'DIST';Test de select sur la table PP10 éloignée à partir de la base locale :
select * from PP10@BASE_DIST where CDPCOM='1';
Création du package sur la base distante
Exemple : insertion de la date système dans une table spécifiquedrop table MY_TABLE
/
create table MY_TABLE (MYDATE DATE)
/
drop package MY_PACKAGE
/
create package MY_PACKAGE as
procedure UPDT_DATE;
end MY_PACKAGE;
/
create package body MY_PACKAGE as
procedure UPDT_DATE is
BEGIN
insert into MY_TABLE values (SYSDATE);
END UPDT_DATE;
end MY_PACKAGE;
/
Test d’exécution du package a partir de la base éloignée :
SQL> begin my_package.updt_date@BASE_DIST;
2 end;
3 /
PL/SQL procedure successfully completed.
SQL> select sysdate from dual;
2002-05-17-14.34.18
SQL> select * from my_table@BASE_DIST;
2002-05-17-14.34.04
Exemple de traitement HR Access
En cas de création de dossier, on exécute la procédure stockée UPDT_DATE sur la base distante et on récupère la plus grande date dans la table distante MY_TABLE.Working :
Contexte de Variables TBW002 du traitement TT-TPSORA
---------------------------------------- Variables BB --------------
010 * HOST-VARIABLES
020 * --------------
030 * <DEBSEC>SO
040 01 H-MYDATE PIC X(19).
050 * <FINSEC>SO
Procedure :
Contexte de Procédures TBP012 du traitement TT-TPSORA
---------------------------------------------------- Fonction BB -------------
010 N EXECUTION D'UNE PROCEDURE STOCKE 10 BL
020 * SUR UNE BASE DE DONNEES DISTANTE
030 *
040 * PREREQUIS :
050 * - DATABASE LINK BASE_DIST
060 * - PACKAGE MY_PACKAGE SUR DIST
070 * - PROCEDURE UPDT_DATE SUR DIST
075 COB DISPLAY "<DIGIX> ENTER TTTPSORA"
080 EXQ EXECUTE
085 BEGIN
090 MY_PACKAGE.UPDT_DATE@BASE_DIST;
100 END;
110 ERR 0000015SQLCODE 99 IT SQLCODE NOT = ZERO
115 COB DISPLAY "<DIGIX> SQLCDE1 " SQLCODE
120 GT 10
130 EXQ SELECT 99 BL
140 MYDATE INTO :H-MYDATE
150 FROM MY_TABLE@BASE_DIST
160 ERR 0000025SQLCODE 99 IT SQLCODE NOT = ZERO
162 COB DISPLAY "<DIGIX> SQLCDE2 " SQLCODE
164 GT 10
170 COB DISPLAY "<DIGIX> " H-MYDATE 99 EL
Incident a la compilation :
Les options de précompilation doivent intégrer une spécificité PL/SQL
Error at line 15886, column 24 in file FP800BNA.pco
000010 EXEC SQL EXECUTE TBP012
.......................1
PCB-S-00008, Must use option SQLCHECK=SEMANTICS(FULL) when there is embedded PL/SQL
Si l'option sqlcheck=semantics est ajoutée (fichier config, item PROFLAGS), la compilation du source affiche des warning volumineux avec un code retour bloquant :
/oracle/8.1.5/bin/procob select_error=yes MODE=ANSI sqlcheck=SEMANTICS iname=FP800BNA.pco oname=FP800BNA.cbl
Pro*COBOL: Release 8.1.5.0.0 - Production on Fri May 17 16:26:39 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
System default option values taken from: /oracle/8.1.5/precomp/admin/pcbcfg.cfg
Error at line 6766, column 13 in file FP800BNA.pco
000001 EXEC SQL DECLARE CZOTD12 CURSOR FOR MACSYS
............1
PCB-S-00576, PLS-201: identifier 'ZOTD12' must be declared
Error at line 6766, column 13 in file FP800BNA.pco
000001 EXEC SQL DECLARE CZOTD12 CURSOR FOR MACSYS
............1
etc...
Il faut ajouter une seconde option userid=HR/** (fichier config, item PROFLAGS) pour permettre au précompilateur de vérifier l'existence des objets dans le dictionnaire Oracle.
En conséquence, on placera dans le fichier $SIGACS/adm/cfg/config :
PROFLAGS=select_error=yes MODE=ANSI sqlcheck=SEMANTICS userid=HR/**
Ces modifications faites, la compilation cobol se termine bien.
---
--- FP800BNA.pco --> FP800BNA.so
---
/oracle/8.1.5/bin/procob select_error=yes MODE=ANSI sqlcheck=SEMANTICS userid=HR/HR iname=FP800BNA.pco oname=FP800BNA.cbl
Pro*COBOL: Release 8.1.5.0.0 - Production on Fri May 17 16:59:12 2002
(c) Copyright 1999 Oracle Corporation. All rights reserved.
System default option values taken from: /oracle/8.1.5/precomp/admin/pcbcfg.cfg
cob -C nolist -vz -C ASSIGN=EXTERNAL -C SEQUENTIAL=LINE -C IBMCOMP -C SIGN=EBCDIC -C WRITELOCK -C NOTRUNC -C NOBOUND -C PERFORM-TYPE=MF -C COPYLIST -C NORESEQ -U FP800BNA.cbl
* Micro Focus Server Express V1.1 revision 000 Compiler
* Copyright (C) 1984-2000 MERANT International URN HXCAI/AA0/00000G
...
* Accepted - NORESEQ
* Compiling FP800BNA.cbl
* Total Messages: 0
* Data: 81196 Code: 160818
* Server Express V1.1.0 Code generator
* Copyright (C) 1984-2000 MERANT International Ltd. All rights reserved.
* Accepted - verbose
* Generating FP800BNA
* Data: 81728 Code: 264232 Literals: 13512.
A noter :
- L'ajout de l'option userid fait que le user/password de connexion Oracle et présent dans le fichier $SIGACS/adm/cfg/config, et dans tous les compte rendus de précompilation...
- L'ajout de l'option spellcheck=semantics impose que les tables soient créées (par RBH, RBF) avant la génération physique des programmes (par RBG, RBA).
L'executable fonctionne.
On trouve dans les traces après exécution :
<DIGIX> ENTER TTTPSORA
<DIGIX> 2002-05-17-16.23.00
SQL> select * from MY_TABLE@BASE_DIST;
2002-05-17-16.23.00
Merci
RépondreSupprimerBonjour,
RépondreSupprimerJe recherche la syntaxe pour appeler une procédure stockée dans un traitement HR avec des paramétres en entrée et en sortie.
Merci par avance.