2016-09-21 8 views
0

두 문자열을 비교하려고합니다. 하나는 IN 매개 변수 (myname)이고 다른 하나는 하드 코드 ('abcd')입니다.문자열 오라클 비교 절차

(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

Youre 코드가 예상대로 작동합니다. 테스트 목적으로 로깅을 추가했습니다. 코드를 호출하거나 매개 변수에 대한 로깅을 추가하고 거기에서 작업하십시오.

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