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”下划线。group by 或有子句有什么问题吗?

4

1 回答 1

4

我看到三个错误(尽管可能还有更多)

  • Oracle 不使用AS关键字来分配表别名。所以AS ncv无效。如果要ncv用作子查询的别名,则需要删除AS(尽管选择一个恰好与局部变量名称冲突的别名似乎很奇怪)。
  • 您不能在GROUP BY子句中使用位置符号。您需要指定要分组的列的名称,而不是它们的位置。
  • 您不能在子句中使用SELECT列表中定义的别名。HAVING您必须在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 来创建此代码中引用的表,那将非常有帮助。这将允许我们在我们的系统上测试函数是否编译,而不是试图猜测语法错误

于 2013-02-01T14:33:12.260 回答