1
votes

Comment puis-je convertir une variable entière dans PLSQL pour la passer à un paramètre de procédure booléenne?

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;


0 commentaires

3 Réponses :


0
votes

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.


0 commentaires

2
votes

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 ...


1 commentaires

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é.



0
votes

Il n'y a pas de conversion implicite de nombres ou de chaînes en booléen, mais une simple expression vrai / faux 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);

Cela passera true si i_includeLines vaut 1, false si ce n'est pas 1, sinon null.

Si vous devez traiter null comme false alors vous aurez besoin d'un case / coalesce / nvl ou d'une expression similaire.


0 commentaires