2011-08-19 2 views
1

내 함수에서 내가 01356666을 전달한 다음 BLAH를 반환하는 이유를 이해하려고 노력 중이다. 그 다음에 전달 된 다른 값은 null 값이다. 내 기대는 BLAH를 반환한다. SELECT INTO를 수행 한 후 str_mgrin_out을 재설정 한 이후에 전달 된 내용 중 하나입니다. 필자는 Oracle 10g에서 이것을 테스트 해 왔습니다.함수는 내가 기대하는 바를 반환하지 않는다.

CREATE OR REPLACE FUNCTION GET_MANAGERGIN2 (str_empgin_in IN varchar2) 
RETURN varchar2 
AS 
str_mgrgin_out varchar2(10); 
BEGIN 
    SELECT 'FOO' INTO str_mgrgin_out FROM dual WHERE str_empgin_in = '01356666'; 

    str_mgrgin_out := 'BLAH'; 

    RETURN str_mgrgin_out; 
END GET_MANAGERGIN2; 
/

-- Returns null but expecting BLAH 
SELECT GET_MANAGERGIN2('00356666') FROM dual; 
-- Returns BLAH 
SELECT GET_MANAGERGIN2('01356666') FROM dual; 

답변

2

나는 SELECT INTO가 예외를 던질거야 str_mgrgin_out에 정확히 하나의 값을 반환하지 않는 경우 때문입니다 가정 것, 그래서 str_mgrgin_out := 'BLAH'; 라인이 결코 실행되지됩니다.

나는이 오류가 ORA-01403 일 것이라고 생각합니다. 같은 말에 예외 처리기를 추가

시도해보십시오 선택 일치하는 행을 제로

CREATE OR REPLACE FUNCTION GET_MANAGERGIN2 (str_empgin_in IN varchar2) 
RETURN varchar2 
AS 
str_mgrgin_out varchar2(10); 
BEGIN 
    BEGIN 
     SELECT 'FOO' INTO str_mgrgin_out FROM dual WHERE str_empgin_in = '01356666'; 

     str_mgrgin_out := 'BLAH'; 
     Exception 
      When Others THen 
       str_mgrgin_out := 'BLAH'; 
    END; 
    RETURN str_mgrgin_out; 
END GET_MANAGERGIN2; 
+0

감사합니다. 이것은 내 전반적인 목표에 올바른 방향을 제시합니다. – Snipe656

2

을 : 그것은 될 수 있도록

Exception 
    When Others Then 
     str_mgrgin_out := 'BLAH'; 

당신은뿐만 아니라 BEGIN...END 그것을 둘러싸고해야 할 수도 있습니다 with NO_DATA_FOUND PL/SQL 예외가 발생합니다.

그러나 NO_DATA_FOUND는 SQL 오류로 인식되지 않고 결과 집합의 끝으로 인식됩니다.

따라서 SELECT에서 사용하면 null 값이 반환됩니다.

관련 문제