2013-02-01 50 views
0

我输入了一个函数,我在这里有一个错误,我不知道它是什么。 你能给我一只手吗?Oracle函数错误

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'关键字。 Oracle不允许使用表别名。 –

回答

4

我看到三个错误(虽然可能有更多)

  • Oracle不使用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

非常感谢。我感谢您的帮助。有效。 –