2016-10-11 65 views
0

我正在檢查列的長度和精度,如果精度高於數據庫,那麼我應該執行alter system。錯誤類型的oracle表達式,同時檢查變量

似乎錯誤是在這裏(COL_COUNT <> 0 AND TO_NUMBER(OLD_LENGTH) < 6,2)

編輯

DECLARE COL_COUNT NUMBER; 
OLD_LENGTH number(6); 
old_prec number(6); 
BEGIN 
COL_COUNT:= 0; 
SELECT DATA_LENGTH, DATA_PRECISION INTO OLD_LENGTH , old_prec FROM USER_TAB_COLS WHERE TABLE_NAME='EX_EMPLOYEE' AND COLUMN_NAME='ID'; 
SELECT COUNT (1) INTO COL_COUNT FROM USER_TAB_COLUMNS WHERE TABLE_NAME='EX_EMPLOYEE'AND COLUMN_NAME='ID'; 
IF (COL_COUNT <> 0 AND to_number(OLD_LENGTH) < 6.2) THEN 
EXECUTE IMMEDIATE ('ALTER TABLE EX_EMPLOYEE MODIFY ID NUMERIC(6,2)'); 
END IF; 
END; 
/
+1

嘗試使用6.2(點代替逗號) –

+0

'select count()'在代碼中的該位置無用。如果該列不存在,第一個'select'將會拋出一個'ORA-01403:沒有找到數據',並且PL/SQL塊將會終止 –

+0

新代碼是無效的PL/SQL,並且使得一切更加令人困惑 –

回答

1

這不是你應該如何比較data_lengthdata_precision的值。他們比較爲正確的號碼,不要將其轉換成字符串:

DECLARE 
    old_length NUMBER; 
    old_prec NUMBER; 
BEGIN 

    SELECT data_length, coalesce(data_precision,0) 
    INTO old_length, old_prec 
    FROM user_tab_cols 
    WHERE table_name='EX_EMPLOYEE' 
    AND column_name='ID'; 

    IF (old_length <> 6 and old_prec <> 2) THEN 
    EXECUTE IMMEDIATE ('ALTER TABLE EX_EMPLOYEE MODIFY ID NUMERIC(6,2)'); 
    END IF; 

END; 
/

注意,SELECT COUNT(*)後的第一個選擇是沒用的。如果沒有這樣的列,那麼第一個SELECT data_length, data_precision INTO將已經拋出ORA-01403: no data found異常,並且如果列存在,代碼將永遠不會檢查。

+0

我試圖避免使用2變量像'INTO old_length,old_prec'如果column_name是varchar2然後'IF(old_length <> 6和old_prec <> 2)'將是一個問題,因爲我沒有prec ..did你明白爲什麼我將它添加到obne變量? – Moudiz

+0

@Moudiz:然後使用'coalesce()' - 但在這種情況下,您應該也可以檢查實際的'data_type'。 –

+0

我在我的問題中添加了編輯,所以你可以理解我在做什麼,我試圖檢查varchar和數字,如果它的數字我添加了精度和長度 – Moudiz

0

Oracle使用一期小數。逗號扔掉了。試試:

DECLARE COL_COUNT NUMBER; 
OLD_LENGTH varchar2(50); 
BEGIN 
COL_COUNT:= 0; 
SELECT DATA_LENGTH||'.'||DATA_PRECISION INTO OLD_LENGTH FROM USER_TAB_COLS WHERE TABLE_NAME='EX_EMPLOYEE' AND COLUMN_NAME='ID'; 
SELECT COUNT (1) INTO COL_COUNT FROM USER_TAB_COLUMNS WHERE TABLE_NAME='EX_EMPLOYEE'AND COLUMN_NAME='ID'; 
IF (COL_COUNT <> 0 AND to_number(OLD_LENGTH) < 6.2) THEN 
EXECUTE IMMEDIATE ('ALTER TABLE EX_EMPLOYEE MODIFY ID NUMERIC(6,2)'); 
END IF; 
END; 
0

嘗試使用「。」分隔符代替逗號: select to_number('6.2') from dual; --works select to_number('6,2') from dual; --returns error