Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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 :
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 :
// 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
Bonjour, l'interface Oracle OCI ne supporte pas les booléens (?)
=> remplace par un NUMBER = 0/1
Hors ligne
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
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?
Hors ligne
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
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...
Hors ligne