2012-10-22 87 views
11

我有以下代碼:印刷變量

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; 

我想打印變量v_six_years的價值,但我得到的錯誤:

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

如何打印變量的值爲v_six_years

回答

11

看來你不能Concat的varcharboolean

定義這個功能:

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; 

,並使用它像這樣:

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

PL/SQL沒有文字來表示布爾值。您必須將v_six_years布爾值轉換爲字符串,或者如果希望打印該值,則不使用布爾值。如果你想顯示值,PL/SQL布爾值對於邏輯來說是很好的,但是沒用。

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; 

或者

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

您可以使用以下打印布爾值在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; 

快樂新年份

+2

你能請爲什麼這個代碼回答這個問題的解釋[編輯]?僅限代碼答案[阻止](http://meta.stackexchange.com/q/148272/274165),因爲他們沒有教導解決方案。 (另外,代碼格式很糟糕,請在提交**之前使用Ctrl-K和**預覽您的文章。) –

+0

這不回答OP問題。 'dbms_output.put_line'可以採用varchar2參數,但不是布爾值,這就是問題所在。 –

3

dbms_output.put_line不超載接受布爾argument.Simple一行的答案是

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