2012-10-22 12 views
11

Mam następujący kod:zmienne drukowania w 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; 

Chcę drukować wartość zmiennej v_six_years, ale otrzymuję błąd:

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

Jak drukować wartość zmiennej v_six_years?

Odpowiedz

11

Wydaje się, że nie może Concat varchar i boolean.

Zdefiniuj tę funkcję:

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; 

i używać go tak:

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

PL/SQL nie ma literału reprezentującego wartości logiczne. Konieczne będzie przekonwertowanie wartości logicznej v_six_years na ciąg lub nie użycie wartości logicznej, jeśli chcesz wydrukować tę wartość. Boleany PL/SQL są świetne dla logiki, ale bezużyteczne, jeśli chcesz wyświetlać wartość.

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; 

Albo

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

Można użyć poniżej, aby wydrukować wartość logiczną w 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 rok

+2

mógłbyś [edytuj] wyjaśnieniem, dlaczego ten kod odpowiada na pytanie? Odpowiedzi tylko na kod są zniechęcane (http://meta.stackexchange.com/q/148272/274165), ponieważ nie uczą rozwiązania. (Brakuje również formatowania kodu, użyj Ctrl-K i ** sprawdź swój wpis przed przesłaniem **.) –

+0

To nie odpowiada na pytanie OP. 'dbms_output.put_line' może przyjmować argument varchar2, ale nie boolean i to jest pytanie. –

3

dbms_output.put_line nie jest przeciążony, aby zaakceptować wartość logiczną argument.Simple jedna linia odpowiedź byłaby

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