2012-08-08 4 views
0

안녕하세요 저는 Oracle에서 다음과 같은 함수를 만들었습니다. 함수에 date-1 및 date-2 매개 변수를 전달해야하며 함수는 다른 날짜를 반환해야합니다.오라클 기능에서 데이터를 반환 하시겠습니까?

아래 코드를 참조하십시오.

create or replace function GETD(p_d1 in date, 
           p_d2 in date) return DATE 
    as 
     l_result DATE; 
    begin 
    SELECT EDIT_Date into l_result FROM qa.employees WHERE qa.employee_join_date BETWEEN TO_DATE(p_d1, 'MM/DD/YYYY') AND TO_DATE(p_d2, 'MM/DD/YYYY') AND ROWNUM <= 1 
    ; 
     return l_result; 
    end; 

은 내가

SELECT GETD('27-JUN-12','28-JUN-12') FROM DUAL 

컴파일되는 기능 아래와 같은 기능을 수행하고 메신저가 매개 변수를 전달하는 동안 다음과 같은 오류를 얻을 기능 "유효한 월"을 실행 할 수 있습니다. 메신저 잘못 저스틴

답변

1

먼저

덕분에가는 곳 은 어떤 하나는 날짜 변수에 TO_DATE를 호출하지 않아야합니다, 제발 말해 수 없습니다. 그렇게하면 Oracle에서 먼저 세션의 NLS_DATE_FORMAT을 사용하여 날짜를 문자열로 변환 한 다음 지정된 형식 마스크를 사용하여 날짜로 문자열을 다시 변환합니다. NLS_DATE_FORMAT이 지정된 형식 마스크와 일치하지 않으면 (NLS_DATE_FORMAT이 클라이언트에 의해 제어되므로 일부 사용자와 세션은 필연적으로 다른 날짜 형식을 갖게 됨) 오류가 발생합니다.

시간 구성 요소를 무시하기 만하면, 대신 trunc 함수를 사용해야합니다.

create or replace function GETD(p_d1 in date, 
           p_d2 in date) 
    return DATE 
as 
    l_result DATE; 
begin 
    SELECT EDIT_Date 
    into l_result 
    FROM qa.employees 
    WHERE qa.employee_join_date BETWEEN trunc(p_d1) AND trunc(p_d2) 
    AND ROWNUM <= 1; 

    return l_result; 
end; 

rownum <= 1 조건의 존재는 odd-- 조금 당신이 정말로 employee_join_date 기준과 일치하는 테이블에서 임의의 행을 인출 할 같지는 않다 보인다. 요구 사항을 알지 못하면 최소 (또는 최대) edit_date의 행을 가져 오는 deterministic 작업을 수행하려는 것 같습니다.

두 번째로 함수를 호출 할 때 문자열을 전달하지 않고 오라클이 암시 적으로 문자열을 세션의 NLS_DATE_FORMAT을 사용하여 날짜로 변환하도록하지 말고 DATE 매개 변수를 전달해야합니다. 당신이 날짜 리터럴을

SELECT GETD(date '2012-06-27', date '2012-06-28') 
    FROM DUAL 

를 사용하거나 날짜에 문자열을 변환하면 명시 적으로 TO_DATE

SELECT GETD(to_date('27-JUN-12', 'DD-MON-RR'), to_date('28-JUN-12', 'DD-MON-RR')) 
    FROM DUAL 

다음 통화에 관계없이 클라이언트의 NLS_DATE_FORMAT의 작동 사용.

+0

Thanks Buddy 정말 도움이되었습니다 .... !!! !!! –

관련 문제