2012-10-22 10 views
11

Ho il seguente codice:variabili di stampa in PL/SQL

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; 

voglio stampare il valore della variabile v_six_years, ma sto ottenendo l'errore:

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

come stampare il valore della variabile v_six_years?

risposta

11

Sembra che non si può concat varchar e boolean.

Definire questa funzione:

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; 

e usarlo in questo modo:

DBMS_OUTPUT.PUT_LINE('flag '|| BOOLEAN_TO_CHAR(v_six_years)); 
1

PL/SQL non ha un valore letterale per rappresentare valori booleani. Dovrai convertire il valore booleano v_six_years in una stringa, o non usare un valore booleano se desideri stampare il valore. I booleani PL/SQL sono ottimi per la logica ma inutili se si desidera visualizzare il valore.

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; 

O

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; 
6

È possibile utilizzare di seguito per stampare valore booleano in PLSQL

dbms_output.put_line('v_six_years '|| sys.diutil.bool_to_int(v_six_years)); 
-5
declare 
    v_line varchar2(40); --declare 
begin 
    v_line := 'Happy new year'; --assigns 
    dbms_output.put_line (v_line); --display 
end; 

Happy new anno

+2

La prego [modifica] in una spiegazione del motivo per cui questo codice risponde alla domanda? Le risposte al solo codice sono [scoraggiate] (http://meta.stackexchange.com/q/148272/274165), perché non insegnano la soluzione. (Inoltre, la formattazione del codice è terribilmente carente: usa Ctrl-K e ** visualizza l'anteprima del tuo post prima di inviare **.) –

+0

Questo non risponde alla domanda OP. 'dbms_output.put_line' può accettare l'argomento varchar2 ma non booleano e questa è la domanda. –

3

dbms_output.put_line non sovraccaricare di accettare un valore booleano argument.Simple una risposta linea sarebbe

dbms_output.put_line(case when v_six_years = true then 'true' else 'false' end);