2016-09-21 82 views
0

試圖比較兩個字符串。一個來自IN參數(myname),另一個是硬編碼('abcd')。Oracle過程中的字符串比較

(myname IN VARCHAR2) 
-- myname will be set to 'abcd' when calling this procedure 
DECLARE 
name VARCHAR2(10):=myname; 
IF(name='abcd') THEN 
--update something in database 
END IF; 

實際代碼如下。 idegreeName設置爲'HONS'。如果我刪除阻止,那麼我的程序工作正常。但我需要IF塊來執行更新查詢。

// Calling in JAVA 
stmt = (OracleCallableStatement) conn.prepareCall("{ call receiveAdmission2(?,?,?,?,?,?,?,?,?,?,?,?,?,?) }"); 
// my procedure 
    CREATE OR REPLACE PROCEDURE NU_DB.receiveAdmission2 (

    iAdmissionRoll   IN VARCHARARRAY, 
    iUserId     IN VARCHAR2, 
    iCollegeCode   IN VARCHAR2, 
    isessionId    IN VARCHAR2, 
    isubjectId    IN VARCHAR2, 
    iMeritType    IN VARCHAR2, 
    iStatus     IN VARCHAR2, 
    iXforward    IN VARCHAR2, 
    iVia     IN VARCHAR2, 
    iRemoteAddress   IN VARCHAR2, 

    oResponseCode   OUT NUMBER, 
    oResponseMessage  OUT VARCHAR2, 
    oResponse    OUT VARCHAR2, 

    idegreeName    IN VARCHAR2 

) 
IS 

tErrorCode VARCHAR2(20); 
tErrorMsg VARCHAR2(400); 
tResponse VARCHAR2(100); 

BEGIN 

    oResponse:=''; 
    DECLARE 
    str1 VARCHAR2(10):=idegreeName; 

    Begin 

     FOR i IN 1 .. iAdmissionRoll.COUNT 
     LOOP 


      IF(str1='HONS') THEN 

      UPDATE nu_hons_result set STATUS=iStatus where ADMISSION_ROLL=iAdmissionRoll(i) and MERIT_TYPE=iMeritType and COLLEGE_CODE=iCollegeCode and SUBJECT_ID=isubjectId and STATUS='Student Requested'; 

      END IF; 

     if (sql%rowcount > 0) then 
      tResponse := 'Successfully approved.'; 

      if(iMeritType<>5) then 

      UPDATE nu_college_subject_map set AVAILABLE_SEAT=AVAILABLE_SEAT-1 where SESSION_ID=isessionId and COLLEGE_CODE=iCollegeCode and SUBJECT_ID=isubjectId; 

      end if; 


      insert into NU_HONS_SUBJECT_ADMISSION (ADMISSION_ROLL,SESSION_ID,COLLEGE_CODE,SUBJECT_ID,APPROVED_BY,APPROVED_ON) 
       values(iAdmissionRoll(i),isessionId,iCollegeCode,isubjectId,iUserId,sysdate); 

      insert into nu_log_admission values (iAdmissionRoll(i),isessionId,iCollegeCode,iMeritType,iStatus,sysdate,isubjectId); 

      else 
      tResponse := 'Failed to approve.'||idegreeName; 
      end if; 

     oResponse := oResponse || tResponse || '###'; 


     END LOOP; 

    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
     tErrorCode:=SQLCODE; 
     tErrorMsg:=SUBSTR(SQLERRM, 1, 400); 
     oResponseCode := 1; 
     oResponseMessage :=tErrorMsg; 
     ROLLBACK; 
     Return; 
     WHEN OTHERS THEN 
     tErrorCode:=SQLCODE; 
     tErrorMsg:=SUBSTR(SQLERRM, 1, 400); 
     oResponseCode := 2; 
     oResponseMessage :=tErrorMsg; 
     ROLLBACK; 
     Return; 

    End; 

END receiveAdmission2; 
/

問題是IF塊沒有執行。

+2

顯然myname不等於'abcd'。你能粘貼一個完整的例子嗎?我的意思是程序以及你如何稱呼它 –

+0

我剛剛用完整的代碼編輯了我的問題。 –

+0

1.你怎麼知道IF塊沒有執行。 –

回答

0

你的代碼像預期的那樣工作。我爲測試目的添加了日誌記錄。顯示如何調用代碼或爲參數添加日誌記錄並從那裏開始工作

DECLARE name VARCHAR2(10); 
BEGIN 

name := 'abcd'; 

IF (name = 'abcd') THEN 
dbms_output.put_line('equal'); 
ELSE 
dbms_output.put_line('NOT equal'); 
END IF; 

END; 
+0

我剛編輯我的問題。需要來自IN參數的字符串。 –

+1

最佳做法是將OUT參數作爲最後的參數。 – lordkain