2017-03-09 2 views
0

PL/SQL에 익숙하지 않아 관련 ID 값을 입력하면 (즉, 한 필드를 입력하고 같은 레코드와 연결된 다른 필드를 반환 할 때) 문자열 값을 반환하는 간단한 함수를 작성하려고합니다. 예를 들어, 주소와 관련 ID가있는 테이블에서 함수에 '100'(따옴표 제외)을 전달하면 '350 Pearl St'이 반환됩니다.Oracle PL/SQL : 동일한 레코드에 대한 ID 필드를 기반으로 문자열 값을 반환하는 방법은 무엇입니까?

지금까지 내가 가진 :이 목록을 반환

CREATE OR REPLACE FUNCTION get_term 
    (MAJOR_ID_IN IN NUMBER) 
    RETURN VARCHAR2 
IS 
BEGIN 
    SELECT t.TERM_NAME 
    FROM CV_RELATION r, CV_TERMS t 
    WHERE t.TERM_ID = r.MAJOR_ID_IN; --Primary Key linked to Foreign Key 
END get_term; 

; 그러나 문자열 이름을 사용하여 다른 함수에서 성공 메시지를 반환 할 수 있으므로 다소 신빙성이 떨어진 ID를 반환하는 대신 (예 : '주소 350을 성공적으로 업데이트했습니다.'대 'Pearl St'대 'You 've successfully updated 주소 100 '). 다른 테이블의 외래 키에서 ID를 호출한다는 점에 유의하십시오.

답변

2

시도해보십시오.

반환 변수를 추가했습니다. 그런 다음 INTO 변수를 선택했습니다. 나는 결국 변수를 반환했다. 나는 또한 관계없는 테이블을 제거했다. 그 테이블에 가입하지 않았으므로 데카르트 조인으로 인해 어려움을 겪을 것이지만 입력 변수가 필요한 키이므로 어쨌든 필요하지 않았습니다.

이제 실제로는 충분하지 않습니다. SELECT .. INTO를 사용하면 단 하나의 행만 반환 될 때 잘 작동합니다. 행이 반환되지 않으면 예외입니다. 이 예외를 catch하고 반환 값을 기본값으로 설정하여이 문제를 해결할 수 있습니다. > 1 행이 반환되면 예외입니다. FETCH FIRST ROW ONLY (12c에서 사용 가능)와 같이 조회가 하나의 행만 리턴하도록 제한되어 있는지 확인하여이를 수정할 수 있습니다.

CREATE OR REPLACE FUNCTION get_term 
    (MAJOR_ID_IN IN NUMBER) 
    RETURN VARCHAR2 
IS 
    ret_val cv_terms.term_name%type; 
BEGIN 
    SELECT t.TERM_NAME 
    into ret_val 
    FROM CV_TERMS t 
    WHERE t.TERM_ID = MAJOR_ID_IN; --Primary Key linked to Foreign Key 

    return ret_val; 
END get_term; 
+0

감사합니다. 나는 단순함과 부적절 함을 위해 그 시간에 예외 (NO_DATA_FOUND와 TOO_MANY_ROWS)를 추가하지 않았지만 나는 그들을 잡을 것이다. 올바른 것으로 표시되었습니다. – snl330

+0

+1 반환 변수의 데이터 유형을 고정합니다. (반환 데이터 유형이'varchar2'로 선언되었지만 변수가 고정 데이터 유형으로되어 있기 때문에 잠재적으로 문제가 발생할 수 있습니까?이 경우 앵커 유형 **이 **'varchar2'이므로 중요하지 않습니다.) +1은 또한 잠재적 인 예외를 논의하기위한 것입니다. 잘 하셨어요! – mathguy

+0

@mathguy 고정 유형은 cv_terms 테이블의 정의로 인해 항상 varchar2가됩니다. 듀크, +1 하겠지만 아직 할 수는 없어요. :) 다시 한번 감사드립니다. – snl330

관련 문제