web-dev-qa-db-fra.com

impression des variables en pl / sql

J'ai le code suivant:

DECLARE
   v_hire_date DATE:='30-Oct-2000';
   v_six_years BOOLEAN;  
BEGIN
IF MONTHS_BETWEEN(SYSDATE,v_fecha_contrato)/12 > 6 THEN
      v_six_years:=TRUE;
ELSE
      v_six_years:=FALSE;
END IF;
DBMS_OUTPUT.PUT_LINE('flag '||v_six_years);
END;

Je veux imprimer la valeur de la variable v_six_years, mais je reçois l'erreur:

ORA-06550: line 10, column 24:
PLS-00306: wrong number or types of arguments in call to '||'
ORA-06550: line 10, column 3

Comment imprimer la valeur de la variable v_six_years?

13
Layla

Il semble que vous ne puissiez pas concatérer varchar et boolean.

Définissez cette fonction:

FUNCTION BOOLEAN_TO_CHAR(FLAG IN BOOLEAN)
RETURN VARCHAR2 IS
BEGIN
  RETURN
   CASE FLAG
     WHEN TRUE THEN 'TRUE'
     WHEN FALSE THEN 'FALSE'
     ELSE 'NULL'
   END;
END;

et utilisez-le comme ceci:

DBMS_OUTPUT.PUT_LINE('flag '|| BOOLEAN_TO_CHAR(v_six_years));
11
mzzzzb

Vous pouvez utiliser ci-dessous pour imprimer la valeur booléenne dans PLSQL

dbms_output.put_line('v_six_years '||  sys.diutil.bool_to_int(v_six_years));
8
Rocker

dbms_output.put_line n'est pas surchargé pour accepter un argument booléen. Une réponse simple d'une ligne serait

dbms_output.put_line (cas où v_six_years = true puis 'true' sinon 'false' end);

3
Aniket Thakur

PL/SQL n'a pas de littéral pour représenter les valeurs booléennes. Vous devrez soit convertir la valeur booléenne v_six_years en une chaîne, soit ne pas utiliser de booléen si vous souhaitez imprimer la valeur. Les booléens PL/SQL sont parfaits pour la logique mais inutiles si vous souhaitez afficher la valeur.

DECLARE
   v_hire_date DATE:='30-Oct-2000';
   v_six_years VARCHAR2(1);  
BEGIN
IF MONTHS_BETWEEN(SYSDATE,v_fecha_contrato)/12 > 6 THEN
      v_six_years:='1';
ELSE
      v_six_years:='0';
END IF;
DBMS_OUTPUT.PUT_LINE('flag '||v_six_years);
END;

Ou

DECLARE
   v_hire_date DATE:='30-Oct-2000';
   v_six_years BOOLEAN;  
   v_six_years_display VARCHAR2(5);
BEGIN
IF MONTHS_BETWEEN(SYSDATE,v_fecha_contrato)/12 > 6 THEN
      v_six_years:=TRUE;
      v_six_years_display := 'true';
ELSE
      v_six_years:=FALSE;
      v_six_years_display := 'false';
END IF;
DBMS_OUTPUT.PUT_LINE('flag '||v_six_years_display);
END;
1
Wolf

Vous pouvez imprimer le contenu d'une variable en utilisant le \echo méta-commande. De man psql:

Pour récupérer le contenu de la variable, faites précéder le nom de deux points, par exemple:

testdb=> \echo :foo
bar
0
sergio