2013-02-01 4 views
0

함수를 입력하고 있는데 여기에 오류가 있습니다. 무엇인지 알 수 없습니다. 나에게 손을 줄 수 있겠 니?오라클 함수 오류

CREATE or replace FUNCTION function1(pIdReg in number,pIdPeriod in number) RETURN 

number 
IS 
    ncv number DEFAULT 0; 
BEGIN 
    SELECT COUNT(IdPeriod) 
     INTO ncv 
     FROM(
      SELECT a.IdPeriod, SUM(case when a.nt=0 then -a.valor else a.valor end) AS total --IF(a.nt=0,-a.valor,a.valor)) 
      FROM dc a 
      JOIN emp b ON a.idDoc = b.idDoc 
      WHERE a.idReg = pIdReg AND a.IdPeriod < pIdPeriod AND 
      b.cc != 305 AND 
        (
        b.cc = 302 AND(b.tipomov != 4) 
        OR 
        b.cc != 302 AND(1=1)-- emular el TRUE 
       ) 
      AND a.type != 7 
      GROUP BY 1 HAVING total != 0 
      ) AS ncv; 
     RETURN ncv; 
END; 
/

오류는 SQL 명령이 제대로 종료되지 않았습니다. Sqldeveloper는 밑줄이 표시된 "AS ncv"를 표시합니다. 그룹 별 또는 조항이있는 데 문제가 있습니까? (더있을 수 있지만)

+0

단순히 'AS'키워드를 제거하십시오. 오라클은 테이블 별칭에 이것을 허용하지 않습니다. –

답변

4

나는

  • 오라클은 테이블 별칭을 할당하기위한 AS 키워드를 사용하지 않는 세 가지 오류를 참조하십시오. 따라서 AS ncv은 유효하지 않습니다. 하위 쿼리의 별칭으로 ncv을 사용하려면 AS을 제거해야합니다 (로컬 변수의 이름과 충돌하는 별칭을 선택하는 것이 이상하게 보입니다).
  • GROUP BY 절에 위치 표기법을 사용할 수 없습니다. 위치가 아닌 그룹화하려는 열의 이름을 지정해야합니다.
  • HAVING 절에있는 SELECT 목록에 정의 된 별칭을 사용할 수 없습니다. 당신은 함께 그 세 가지를 퍼팅 HAVING

에 집계 함수를 지정해야합니다, 당신은 여전히 ​​오류를 얻는 경우이

CREATE or replace FUNCTION function1(pIdReg in number,pIdPeriod in number) 
    RETURN number 
IS 
    ncv number DEFAULT 0; 
BEGIN 
    SELECT COUNT(IdPeriod) 
    INTO ncv 
    FROM(
     SELECT a.IdPeriod, 
       SUM(case when a.nt=0 
         then -a.valor 
         else a.valor 
        end) AS total --IF(a.nt=0,-a.valor,a.valor)) 
      FROM dc a 
      JOIN emp b ON a.idDoc = b.idDoc 
      WHERE a.idReg = pIdReg AND a.IdPeriod < pIdPeriod 
      AND b.cc != 305 
      AND (
        b.cc = 302 AND(b.tipomov != 4) 
        OR 
        b.cc != 302 AND(1=1)-- emular el TRUE 
       ) 
      AND a.type != 7 
     GROUP BY a.IdPeriod 
     HAVING SUM(case when a.nt=0 
         then -a.valor 
         else a.valor 
        end) != 0 
     ) ncv; 
    RETURN ncv; 
END; 
/

같은, 그것은 매우 도움이 될 것입니다 원하는 의심 질문을 편집하고 DDL을 제공하여이 코드에서 참조하는 테이블을 만들 수 있다면. 그러면 시스템에서 구문 오류를 추측하지 않고 함수를 컴파일할지 여부를 테스트 할 수 있습니다.

+0

고맙습니다. 도와 주셔서 감사합니다. 그것은 효과가 있었다. –