2012-02-22 112 views
2

我已經寫了FOLL查詢,但得到的錯誤:遇到符號「檔案結尾」

PLS-00103:出現符號「檔案結尾」在需要下列之一時:

:=。 (@%; 以下是存儲過程的查詢 我知道它的語法錯誤,但無法弄清楚到底是哪裏的問題 這將是一個很大的幫助,如果有人幫我

CREATE OR REPLACE PROCEDURE MCSIL_HR.sp_ins_emp_mst_DEV (
    inemp_id     emp_mst.emp_id%TYPE, 
    inemp_restrict_emp   emp_mst.restrict_emp%TYPE, 
    inemp_name     emp_mst.emp_name%TYPE, 
    inemp_email     emp_mst.email_id%TYPE, 
    inemp_pwd     emp_mst.emp_pwd%TYPE, 
    indob      VARCHAR2, 
    indoj      VARCHAR2, 
    indor      VARCHAR2, 
    inemp_status_lkp_id   emp_mst.emp_status_lkp_id%TYPE, 
    inemp_has_reportee_status emp_mst.has_reportees_status_yn%TYPE, 
    inupd_emp_id    emp_mst.emp_id%TYPE, 
    inupd_flag     CHAR, 
    indept      VARCHAR2, 
    inmgr_id   emp_mst.mgr_id%TYPE,     
    outmsg    OUT VARCHAR2, 
    outstatus    OUT VARCHAR2 
) 
IS 

    pgm_error EXCEPTION; 
    as_emp_id emp_mst.emp_id%TYPE; 
    as_cnt  NUMBER; 
    upd_flag VARCHAR2 (3); 
    asdob  DATE; 
    asdoj  DATE; 
    asdor  DATE; 


BEGIN 

    outmsg := ''; 
    outstatus := 'TRUE'; 
    upd_flag := UPPER (TRIM (inupd_flag)); 
-- check if Emp Status lookup value exists in lookup table , if not raise error 
    SELECT COUNT (1) 
    INTO as_cnt 
    FROM lookup l 
    WHERE l.lkp_id = inemp_status_lkp_id; 
    IF as_cnt = 0 
    THEN 
     outmsg := 
      'Employee Sattus LOOK UP VALUE : ' 
     || TO_CHAR (inemp_status_lkp_id) 
     || ' NOT EXISTS IN LOOKUP TABLE '; 
     outstatus := 'INSERT/UPDATE/DELETE Failed.'; 
     RAISE pgm_error; 
    END IF; 
-- check if Yes/No Status ookup value exists in lookup table , if not raise error 
    SELECT COUNT (1) 
    INTO as_cnt 
    FROM lookup l 
    WHERE l.lkp_id = inemp_has_reportee_status; 
    IF as_cnt = 0 
    THEN 
     outmsg := 
      'Has_Reportees Status LOOK UP VALUE : ' 
     || TO_CHAR (inemp_has_reportee_status) 
     || ' NOT EXISTS IN LOOKUP TABLE '; 
     outstatus := 'INSERT/UPDATE/DELETE Failed.'; 
     RAISE pgm_error; 
    END IF; 
-- check whether user modifying data is valid employee 
    SELECT COUNT (1) 
    INTO as_cnt 
    FROM emp_mst e 
    WHERE e.emp_id = inupd_emp_id; 
    IF as_cnt = 0 
    THEN 
     outmsg := 
      'UPDATING USER ID: ' 
     || TO_CHAR (inupd_emp_id) 
     || ' NOT EXISTS IN EMPLOYEE MASTER '; 
     outstatus := 'INSERT/UPDATE/DELETE Failed.'; 
     RAISE pgm_error; 
    END IF; 
    -- checking date formatt (dd-mm-yyyy) 
    IF indob IS NULL 
     OR NOT ( SUBSTR (TRIM (indob), 3, 1) = '-' 
       AND SUBSTR (TRIM (indob), 6, 1) = '-' 
      ) 
    THEN 
     outmsg := 
     'Date of Birth is Blank or Formatt for Date of Birth is not in DD-MM-YYYY, Contact Administrator'; 
     outstatus := 'INSERT/UPDATE/DELETE Failed.'; 
     RAISE pgm_error; 
    END IF; 
    IF indoj IS NULL 
     OR NOT ( SUBSTR (TRIM (indoj), 3, 1) = '-' 
       AND SUBSTR (TRIM (indoj), 6, 1) = '-' 
      ) 
    THEN 
     outmsg := 
     'Date of Join is Blank or Formatt for Date of Join is not in DD-MM-YYYY, Contact Administrator'; 
     outstatus := 'INSERT/UPDATE/DELETE Failed.'; 
     RAISE pgm_error; 
    END IF; 
    IF  indor IS NOT NULL 
     AND NOT ( SUBSTR (TRIM (indor), 3, 1) = '-' 
       AND SUBSTR (TRIM (indor), 6, 1) = '-' 
      ) 
    THEN 
     outmsg := 
     'Formatt for Date of Resign is not in DD-MM-YYYY, Contact Administrator'; 
     outstatus := 'INSERT/UPDATE/DELETE Failed.'; 
     RAISE pgm_error; 
    END IF; 
    asdob := TO_DATE (TRIM (indob), 'DD-MM-YYYY'); 
    asdoj := TO_DATE (TRIM (indoj), 'DD-MM-YYYY'); 
    asdor := TO_DATE (TRIM (indor), 'DD-MM-YYYY'); 
    DBMS_OUTPUT.put_line ( 'LKP SRNO, UPDATE USER EMPCODE OK,' 
         || 'DOB :' 
         || TO_CHAR (asdob) 
         || ',DOJ :' 
         || TO_CHAR (asdoj) 
         || ',DOR :' 
         || TO_CHAR (asdor) 
         ); 
-- check whether user modifying data is valid employee 
    SELECT COUNT (*) 
    INTO as_cnt 
    FROM emp_mst e 
    WHERE e.emp_id = inemp_id; 
    IF upd_flag = 'U' 
    THEN 
     IF as_cnt = 0 
     THEN 
     outmsg := 
       'EMPLOYEE CODE : ' 
      || TO_CHAR (inemp_id) 
      || ' NOT EXISTS IN EMPLOYEE MASTER'; 
     outstatus := 'UPDATE Failed.'; 
     RAISE pgm_error; 
     END IF; 
     UPDATE emp_mst a 
     SET a.rec_dtl = rec_dtl (NULL, NULL, NULL, NULL) 
     WHERE a.rec_dtl IS NULL; 
-- For password change call another procedure 
     UPDATE emp_mst a 
     SET a.emp_name = inemp_name, 
      a.restrict_emp = inemp_restrict_emp,        
      a.email_id=inemp_email,            
a.emp_pwd = ENCRYPT(inemp_pwd), 
      a.dob = asdob, 
      a.doj = asdoj, 
      a.dor = asdor, 
      a.emp_status_lkp_id = inemp_status_lkp_id, 
      a.has_reportees_status_yn = inemp_has_reportee_status,    
      a.rec_dtl.updated_by = inupd_emp_id, 
      a.DEPT= indept, 
     a.MGR_ID = inmgr_id,    
      a.rec_dtl.updated_on = SYSDATE 
     WHERE a.emp_id = inemp_id; 
     IF SQLCODE <> 0 
     THEN 
     ROLLBACK; 
     outstatus := 'FALSE'; 
     outmsg := 'UPDATE Failed.'; 
     RAISE pgm_error; 
     ELSE 
     COMMIT; 
     outstatus := 'TRUE'; 
     outmsg := 'Process sucessfully executed'; 
     END IF; 
    ELSIF upd_flag = 'I' 
    THEN 
     IF as_cnt > 0 
     THEN 
     outmsg := 
       'EMPLOYEE ID : ' 
      || TO_CHAR (inemp_id) 
      || ' ALREADY IN EMPLOYEE MASTER'; 
     outstatus := 'INSERT Failed.'; 
     RAISE pgm_error; 
     END IF; 
     INSERT INTO mcsil_hr.emp_mst 
        (emp_id,restrict_emp, emp_name,email_id, emp_pwd, dob, doj, dor,    ---added by shailesh 
        emp_status_lkp_id, has_reportees_status_yn, 
        rec_dtl,DEPT,MGR_ID 
       ) 
      VALUES (inemp_id,inemp_restrict_emp, inemp_name, inemp_email, ENCRYPT(inemp_pwd), asdob, asdoj, asdor, ---added by shailesh 
        inemp_status_lkp_id, inemp_has_reportee_status, 
        rec_dtl (inupd_emp_id, SYSDATE, NULL, NULL),indept,inmgr_id  
       ); 
     IF SQLCODE <> 0 
     THEN 
     ROLLBACK; 
     outstatus := 'FALSE'; 
     outmsg := 'INSERT Failed.'; 
     RAISE pgm_error; 
     ELSE 
     COMMIT; 
     outstatus := 'TRUE'; 
     outmsg := 'Process Sucessfully executed'; 
     END IF; 
    ELSIF upd_flag = 'D' 
    THEN 
     IF as_cnt = 0 
     THEN 
     outmsg := 
       'EMPLOYEE ID : ' 
      || TO_CHAR (inemp_id) 
      || ' NOT EXISTS IN EMPLOYEE MASTER'; 
     outstatus := 'DELETE Failed.'; 
     RAISE pgm_error; 
     END IF; 
     UPDATE emp_mst a 
     SET a.rec_dtl = rec_dtl (NULL, NULL, NULL, NULL) 
     WHERE a.rec_dtl IS NULL; 
     UPDATE emp_mst a 
     SET a.emp_status_lkp_id = 202,    -- INCATIVE ACCOUNT CODE 
      a.rec_dtl.updated_by = inupd_emp_id, 
      a.rec_dtl.updated_on = SYSDATE 
     WHERE a.emp_id = inemp_id; 
     IF SQLCODE <> 0 
     THEN 
     ROLLBACK; 
     outstatus := 'FALSE'; 
     outmsg := 'DELTE Failed.'; 
     RAISE pgm_error; 
     ELSE 
     COMMIT; 
     outstatus := 'TRUE'; 
     outmsg := 'Process sucessfully executed'; 
     END IF; 
    ELSE 
     outstatus := 'FALSE'; 
     outmsg := 'ACTION FLAG SHOULD BE IN I(Insert)/U(Update)/D(Delete).'; 
     RAISE pgm_error; 
    END IF; 
    DBMS_OUTPUT.put_line ('STATUS :' || outstatus || ', MGS :' || outmsg); 
EXCEPTION 
    WHEN pgm_error 
    THEN 
     BEGIN 
     outstatus := 'FALSE'; 
     DBMS_OUTPUT.put_line ('STATUS :' || outstatus || ', MGS :' || outmsg); 
     raise_application_error (-20999, outmsg); 
     END; 
    WHEN NO_DATA_FOUND 
    THEN 
     BEGIN 
     outmsg := 'INSERT/UPDATE/DELETE FAILED. NO DATA FOUND'; 
     outstatus := 'FALSE'; 
     DBMS_OUTPUT.put_line ('STATUS :' || outstatus || ', MGS :' || outmsg); 
     raise_application_error (-20999, outmsg); 
     END; 
    WHEN OTHERS 
    THEN 
     BEGIN 
     outmsg := 'INSERT/UPDATE/DELETE FAILED. '; 
     outstatus := 'FALSE'; 
     DBMS_OUTPUT.put_line ('STATUS :' || outstatus || ', MGS :' || outmsg); 
     raise_application_error (-20999, outmsg || SQLERRM); 
     END; 
END sp_ins_emp_mst_DEV ; 
/
+1

你有一個無與倫比的(或引用某處,使用二進制搜索找到錯誤,甚至可以是一個BEGIN/END ... – wildplasser 2012-02-22 13:33:06

+1

重構代碼,直到錯誤消失,直到錯誤消失,然後你會知道語法的位置錯誤在於 – user272735 2012-02-22 14:48:48

+0

其實這個錯誤是最有可能由缺少'結束......引起'某處... – Ben 2012-02-22 22:48:58

回答

0

是否使用。 ?SQL * Plus中如果你是,那麼它可能在你的代碼中的空行,這將被解釋爲一行的末尾

我建議你這樣做:

set echo on 
spool sp_ins_emp_mst_dev.log 
<your procedure declaration> 
spool off 

而且看版本仔細查看你的線路號碼。如果他們不從一開始就順利運行到最後,嘗試使空行到的意見(我的選擇),或者set sqlblanklines on