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は、「ASncv」に下線が引かれていることを示しています。group byまたは句を持つことに問題はありますか?

4

1 に答える 1

4

3つのエラーが表示されます(もっとあるかもしれませんが)

  • ASOracleは、テーブルエイリアスの割り当てにキーワードを使用しません。したがってAS ncv、無効です。サブクエリのエイリアスとして使用する場合はncv、を削除する必要がありますAS(ただし、ローカル変数の名前と衝突するエイリアスを選択するのは奇妙に思えます)。
  • GROUP BY句で位取り記数法を使用することはできません。グループ化する列の名前を、位置ではなく指定する必要があります。
  • SELECTリストで定義されているエイリアスをHAVING句で使用することはできません。HAVING句で集計関数を指定する必要があります

これらの3つをまとめると、このようなものが必要だと思います

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 に答える