J'écris des tests unitaires pour une procédure existante qui a des paramètres booléens. Au fur et à mesure que les tests s'exécutent, ils stockent les valeurs des paramètres associés dans une table. Je souhaite utiliser des variables pour définir les colonnes de paramètres dans le tableau et passer à la procédure. Existe-t-il un moyen de passer d'un entier (ce que je vais définir dans ma table) à la procédure (qui nécessite des valeurs booléennes)?
J'ai essayé de transmettre les valeurs 1/0 et les chaînes "TRUE" et "FALSE" à la procédure. J'ai essayé de faire en sorte que ma table utilise un type de données booléen pour les colonnes pertinentes. J'ai essayé CASTing. J'ai essayé d'utiliser une instruction SELECT INTO avec CASE pour définir une variable de type booléen différente en fonction de la valeur de la variable de type entier.
CREATE TABLE UNIT_TEST_RESULTS ( case VARCHAR2(50) ,includeLines NUMBER(1) --this will hold the value of i_includeLines below ,result VARCHAR2(4) ); CREATE OR REPLACE PROCEDURE X_UNIT_TEST AS i_includeLines NUMBER(1) BEGIN i_includeLines:=0; X_THING_TO_TEST(includeLinesBool=>i_includeLines); /*...analyze output...*/ INSERT INTO UNIT_TEST_RESULTS(case,includeLines,result) VALUES ('test',i_includeLines,'fail'); COMMIT; END X_UNIT_TEST;
3 Réponses :
Il n'y a pas de booléen dans votre code donc - voici comment j'ai compris la question:
Vous avez une procédure qui accepte un paramètre qui est booléen:
SQL> declare 2 l_int integer := 1; 3 begin 4 p_test(case when l_int = 1 then true else false end); 5 end; 6 / PL/SQL procedure successfully completed. SQL>
Vous voulez appeler; il y a une variable number ( l_int
dans mon exemple) et vous voudriez la convertir en booléen et la passer comme telle à la procédure p_test
. Voici comment procéder:
SQL> create or replace procedure p_test 2 (par_bool in boolean) 3 is 4 begin 5 null; 6 end; 7 / Procedure created. SQL>
J'espère que cela vous aidera.
Je ferais probablement quelque chose comme
b_includeLines boolean; i_includeLines integer; BEGIN b_includeLines:= false; X_THING_TO_TEST(includeLinesBool=>b_includeLines); /*...analyze output...*/ i_includeLines := case when b_includeLines = true then 1 else 0 end; INSERT INTO UNIT_TEST_RESULTS(case,includeLines,result) VALUES ('test',i_includeLines,'fail'); COMMIT;
ou
i_includeLines NUMBER(1) b_includeLines boolean; BEGIN i_includeLines:=0; b_includeLines := (case i_includeLines when 1 then true else false end); X_THING_TO_TEST(includeLinesBool=>b_includeLines);
Évidemment, l'un ou l'autre de ces cas
les instructions pourraient (et devraient) être encapsulées dans une fonction en supposant que vous allez les appeler régulièrement.
Je vous suggère de ne pas utiliser le mot réservé case
pour un nom de colonne- - ça va vous mordre à un moment donné. Je ne suis pas non plus fan de la notation hongroise pour les noms de variables, mais c'est plutôt un débat religieux ...
Merci. J'ai fini par me rapprocher de votre première suggestion. Je ne suis pas non plus un grand fan de la convention de nom de variable, mais c'est la norme que mon entreprise utilise, donc je suis coincé.
Il n'y a pas de conversion implicite de nombres ou de chaînes en booléen, mais une simple expression vrai / faux comme Cela passera Si vous devez traiter null comme i_includeLines = 1
donne la valeur booléenne true
si i_includeLines a la valeur
1
, vous pouvez donc appeler votre procédure comme ceci: x_thing_to_test(includeLinesBool => i_includeLines = 1);
true
si i_includeLines
vaut 1, false
si ce n'est pas 1, sinon null
. false
alors vous aurez besoin d'un case
/ coalesce
/ nvl
ou d'une expression similaire.