2013-02-01 49 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

非常感謝。我感謝您的幫助。有效。 –