2016-04-13 96 views
0

我創建一個函數,確保所有過時的員工id更新爲總共4個數字。例如,如果一個員工的ID是11,這將是兩個0的級聯:0011 我不斷收到錯誤:PL/SQL嵌套,如果語句

Error(19,4): PLS-00103: Encountered the symbol ";" when 
     expecting one of the following: if 

它在第一嵌套如果標記:

create or replace function ID_RENEWAL(OLD_ID IN VARCHAR2) 
return VARCHAR2 
is UPDATED_ID VARCHAR2(4); 
begin 
if (length(OLD_ID) < 4) THEN 
    UPDATED_ID := '0'||OLD_ID; 
    if (length(OLD_ID) < 4) THEN 
    UPDATED_ID := '0'||OLD_ID; 
     if (length(OLD_ID) = 4) THEN 
     return (UPDATED_ID); 
     end if; 
    end if; 
else 
    UPDATED_ID := SUBSTR(OLD_ID, 1, 4); 
return (UPDATED_ID); 
end; 

有任何想法嗎?

+1

更大的問題是,如果員工的ID用作數據庫中的主鍵,則可能會從數據規範化點中爭奪各種事物W上。相反,請在您的員工表中添加一個屬性,指明員工是否過期(無論如何),並保留其身份。如果您更改ID,它將不再與已使用該ID的任何報告等相匹配。 –

回答

1

您必須結束每個IF聲明與END IF。下面是正確的:

IF (length(OLD_ID) < 4) THEN 
    UPDATED_ID := '0'||OLD_ID; 

    IF (length(OLD_ID) < 4) THEN 
    UPDATED_ID := '0'||OLD_ID; 

    IF (length(OLD_ID) = 4) THEN 
     return (UPDATED_ID); 
    END IF; 
    END IF; 
ELSE 
    UPDATED_ID := SUBSTR(OLD_ID, 1, 4); 
END IF; 

具體的錯誤消息來源於這樣的事實,你沒有把一個END IF;ELSE後,這就是爲什麼功能終止END;被解析爲一個不完整的END IF;

+0

工作正常!我沒有意識到包括最終的ifs – lnjblue

0

這是一個更簡化的形式:

create or replace function ID_RENEWAL(OLD_ID IN VARCHAR2) 
return VARCHAR2 
is 
UPDATED_ID VARCHAR2(4); 
begin 
    SELECT LPAD(SUBSTR(OLD_ID,1,4),4,'0') INTO UPDATED_ID FROM DUAL; 
return (UPDATED_ID); 
end;