2016-09-21 6 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

Очевидно, что мое имя не равно «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

Я только что редактировал мой вопрос. Требуется параметр String из IN. –

+1

Лучшей практикой является установка параметров OUT как последняя. – lordkain

Смежные вопросы