Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 20-03-2008 12:52:57

toto  
Membre Geek
Lieu: Nice
Date d'inscription: 21-05-2007
Messages: 23
Pépites: 111
Banque: 0

Pb d'appel d'une proc stoc dans PB

Bonjour,

Je travaille avec oracle 9i et PB 10.2.
J'ai créé une procédure stockée qui fonctionne correctement lors d'appel via des triggers, ou même directement à la main.
Par contre, dans PB, j'ai repris le script d'exemple fourni sur un autre topic, et j'ai un message d'erreur (toujours le même) qui m'indique une erreur de type de donnée.

Voici le script de la procédure stockée :

Code: sql

CREATE OR REPLACE PROCEDURE P_Check_Formula_AIT
--=============================================================================
-- Copyright 2008, Gloubiboulga
--=============================================================================
-- Purpose     : This procedure check content of Formula AIT for TM existence
-- Input       : The current spacecraft and the formula ait
-- Output      : True if the formula ait contains valid TM, False otherwise
--             : The TM Code in error. '' if no error
-- Restriction : This procedure is used in TUB and TIB triggers on TM table and
--               only if parameter VERIF_TM_FORMULA = 'Y'
--=============================================================================
(as_spacecraft       IN  VARCHAR2,
 as_status_code      IN  VARCHAR2,
 an_sc_vers_id       IN  NUMBER,
 as_formula_ait      IN  VARCHAR2,
 ab_check_formula    OUT BOOLEAN,
 as_tm_error         OUT VARCHAR2)
AS
PRAGMA AUTONOMOUS_TRANSACTION;
s_measure_code           VARCHAR2(10);
s_formula_ait            VARCHAR2(240);
length_formula           NUMBER;
pos                      NUMBER;
s_extract_tm             VARCHAR2(10);
counter                  NUMBER;
FOUND                    BOOLEAN;
-- Test if 'extracted' TM from formula AIT exists as a real TM
CURSOR cpk1_tm(var_spacecraft VARCHAR,
               var_status_code VARCHAR,
               var_sc_vers_id NUMBER,
               var_measure_code VARCHAR) IS
  SELECT 1
  FROM   TM
  WHERE  SPACECRAFT = var_spacecraft
  AND    STATUS_CODE = var_status_code
  AND    SC_VERS_ID = var_sc_vers_id
  AND    MEASURE_CODE = var_measure_code
  AND    var_spacecraft IS NOT NULL
  AND    var_status_code IS NOT NULL
  AND    var_sc_vers_id IS NOT NULL
  AND    var_measure_code IS NOT NULL;
BEGIN
    ab_check_formula := TRUE;
    -- Replace specific characters by spaces
    s_formula_ait := as_formula_ait;

    s_formula_ait := REPLACE(s_formula_ait, '(', ' ');
    s_formula_ait := REPLACE(s_formula_ait, ')', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '*', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '/', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '+', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '-', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '&', ' ');
    s_formula_ait := REPLACE(s_formula_ait, 'ORD', ' ');
    s_formula_ait := REPLACE(s_formula_ait, 'OR', ' ');
    s_formula_ait := REPLACE(s_formula_ait, 'AND', ' ');
    s_formula_ait := REPLACE(s_formula_ait, 'NOT', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '<', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '>', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '<=', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '>=', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '_', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '=', ' ');
    s_formula_ait := REPLACE(s_formula_ait, '.', ' ');
    s_formula_ait := REPLACE(s_formula_ait, ':', ' ');
    s_formula_ait := TRIM(s_formula_ait);
    s_formula_ait := s_formula_ait || ' ';

    length_formula := LENGTH(s_formula_ait);
    WHILE (length_formula > 0) AND (ab_check_formula = TRUE)
    LOOP
        s_formula_ait := LTRIM(s_formula_ait);
        pos := INSTR(s_formula_ait, ' ', 1);
        s_extract_tm := SUBSTR(s_formula_ait, 1, pos - 1);

        IF INSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZ', SUBSTR(s_extract_tm, 1, 1)) > 0 THEN
            -- Search existence of the "extracted" TM
            OPEN  cpk1_tm(as_spacecraft,
                          as_status_code,
                          an_sc_vers_id,
                          s_extract_tm);
            FETCH cpk1_tm INTO counter;
            FOUND := cpk1_tm%FOUND;
            IF FOUND = FALSE THEN
                ab_check_formula := FALSE;
            END IF;
            EXIT WHEN cpk1_tm%NOTFOUND;
            CLOSE cpk1_tm;
        END IF;

        -- Extract next TM in formula AIT field
        s_formula_ait := SUBSTR(s_formula_ait, pos);
        length_formula := LENGTH(s_formula_ait);
    END LOOP;
    IF ab_check_formula = TRUE THEN
       as_tm_error := '';
    ELSE
       as_tm_error := s_extract_tm;
    END IF;
    COMMIT;
END P_Check_Formula_AIT;
/


Et voici mon appel dans PB :

Code: pb

// Check formula_ait content through a stored_proc
Declare PROC_check_formula_ait Procedure For
  P_Check_Formula_AIT (:gstr_datasource.s_spacecraft,
                :gstr_datasource.s_status,
                :gstr_datasource.l_version, 
                :ls_formula_ait)
  USING SQLCA;
EXECUTE PROC_check_formula_ait;
IF SQLCA.sqlcode <> -1 THEN
  FETCH PROC_check_formula_ait INTO :lb_check_formula, :ls_tm_error;
END IF
CLOSE PROC_check_formula_ait;


Pour information, les variables utilisée en entrée : s_spacecraft, s_status et ls_formula_ait sont de type String et l_version est de type Long.
Les variables utilisée en sortie : lb_check_formula est de type Boolean et ls_tm_error est de type String.

En mode Debug, sous PB, à l'exécution de la ligne "EXECUTE...", sqlcode = -1, sqldbcode = 999, sqlerrtext = "Invalid stored procedure parameter type of 'BOOLEAN' on 'AS_FORMULA_AIT".

Quelqu'un aurait-il une idée/une piste sur comment je peux résoudre ce problème ?

Merci,
Bernard

Hors ligne

 

#2 20-03-2008 12:59:31

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: Pb d'appel d'une proc stoc dans PB

Bonjour, l'interface Oracle OCI ne supporte pas les booléens (?)

=> remplace par un NUMBER = 0/1


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 20-03-2008 13:18:37

toto  
Membre Geek
Lieu: Nice
Date d'inscription: 21-05-2007
Messages: 23
Pépites: 111
Banque: 0

Re: Pb d'appel d'une proc stoc dans PB

J'ai modifié ma proc stoc en indiquant number à la place de boolean et idem dans l'appel de la proc stoc dans PB, mais ce qui est bizzare c'est que j'ai toujours le même message d'erreur, avec "Invalid stored procedure parameter type of 'BOOLEAN' on 'AS_FORMULA_AIT'" !!!

Je ne comprend vraiment pas d'où vient cette histoire de boolean.

Hors ligne

 

#4 20-03-2008 14:00:23

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Pb d'appel d'une proc stoc dans PB

Bonjour,

Vérifies que tu pointes bien sur la nouvelle version de ta procédure stockée (Base de donnée, schémas, etc...)
Tu as utilisé quel type numérique au niveau de PB?


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#5 20-03-2008 14:21:23

toto  
Membre Geek
Lieu: Nice
Date d'inscription: 21-05-2007
Messages: 23
Pépites: 111
Banque: 0

Re: Pb d'appel d'une proc stoc dans PB

J'avais effectivement un problème d'aiguillage entre schémas (notre client a plusieurs schémas identiques mais pour travailler sur des données différentes).
J'ai corrigé en précisant en dur sur quel schéma je voulais utiliser ma proc stoc et je n'ai plus d'erreur. Par contre, je n'ai pas l'impression qu'elle s'exécute correctement puisque en sortie, je n'ai pas les valeurs attendues. Alors qu'elle fonctionne appelée dans un trigger, avec les mêmes paramètres en entrée...

Pour le moment, je vais utiliser une solution de contournement qui ne me plait pas du tout, mais vraiment pas, c'est de re-coder ma procédure en fonction PB. Dans certains cas, ma fonction PB sera appelée par l'IHM et dans d'autres, ce sera le trigger qui appellera ma proc stoc.

Par contre, j'aimerai bien résoudre mon problème en appelant directement mon unique proc stoc à l'intérieur de PB.

Je vous remercie pour les pistes ouvertes, mais je suis à la bourre et je n'ai plus trop le temps de chercher d'où vient mon pb.

Faut-il clore ce topic quitte à ce que j'y revienne dans quelques temps ?

Hors ligne

 

#6 20-03-2008 15:22:22

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: Pb d'appel d'une proc stoc dans PB

toto a écrit:

J'avais effectivement un problème d'aiguillage entre schémas (notre client a plusieurs schémas identiques mais pour travailler sur des données différentes).
J'ai corrigé en précisant en dur sur quel schéma je voulais utiliser ma proc stoc et je n'ai plus d'erreur. Par contre, je n'ai pas l'impression qu'elle s'exécute correctement puisque en sortie, je n'ai pas les valeurs attendues. Alors qu'elle fonctionne appelée dans un trigger, avec les mêmes paramètres en entrée...

Vérifies que ton trigger appelle bien aussi la nouvelle version de la procédure.
De plus, je te conseille de tester également le SQLCA.SqlCode après le FETCH sous PB pour vérifier que celui-ci se passe bien.

Sinon, envois nous la nouvelle version de ton package et celle de ton appel PB...


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22