-1

plsqlで2つのパッケージ本体を作成しようとしています。これは私のコードです:

SET SERVEROUTPUT ON

CREATE OR REPLACE PACKAGE p_locations
AS
  FUNCTION f_distance(Lat1 IN NUMBER, Lon1 IN NUMBER, Lat2 IN NUMBER, Lon2 IN NUMBER, Radius IN NUMBER DEFAULT 6387.7) return number;
END p_locations;

/

CREATE OR REPLACE PACKAGE BODY p_locations
AS
  FUNCTION f_distance (Lat1 IN NUMBER, Lon1 IN NUMBER, Lat2 IN NUMBER, Lon2 IN NUMBER, Radius IN NUMBER DEFAULT 6387.7)
  RETURN NUMBER 
  IS
   -- Convert degrees to radians
   DegToRad NUMBER := 57.29577951;

  BEGIN
    RETURN(NVL(Radius,0) * ACOS((sin(NVL(Lat1,0) / DegToRad) * SIN(NVL(Lat2,0) / DegToRad)) +
          (COS(NVL(Lat1,0) / DegToRad) * COS(NVL(Lat2,0) / DegToRad) *
           COS(NVL(Lon2,0) / DegToRad - NVL(Lon1,0)/ DegToRad))));
  END f_distance;
END p_locations;

/

CREATE OR REPLACE PACKAGE p_winkel
AS
  FUNCTION changeOpeningstijd("id" IN number) RETURN boolean;
END p_winkel;

/

CREATE OR REPLACE PACKAGE BODY p_winkel
AS
  FUNCTION changeOpeningstijd("id" IN number) 
  RETURN boolean
  IS
    dbms_output.put_line('dit is uitgevoerd');
    return true;
  END changeOpeningstijd;
END p_winkel;

これを実行すると、PLS-00103 エラーが 3 回発生します。1 つ目は 6 行目と 16 行目で、「.」という記号に遭遇したと述べています。次のいずれかを期待する場合:constant exception <an identifier> <a double-quoted delimited-identifier> table long double ref char time timestamp interval date binary national character nchar The symbol "<an identifier>" was substituted for "." to continue.

奇妙なことに、2 番目のパッケージ本体をコメント アウトすると、すべて正常に動作します。エラーは最初のパッケージ定義の先頭にあります。

ここで何か愚かな間違いをしているのですか、1 つのセッションで 2 つのパッケージを作成できないのですか、それとも他に何が起こっているのでしょうか。これらのエラーにはロジックが表示されません。

4

1 に答える 1

1

BEGINキーワードが不足しています:

CREATE OR REPLACE PACKAGE BODY p_winkel
AS
  FUNCTION changeOpeningstijd("id" IN number) 
  RETURN boolean
  IS
  BEGIN    ---- this was missing
    dbms_output.put_line('dit is uitgevoerd');
    return true;
  END changeOpeningstijd;
END p_winkel;
/

PL/SQL エラーの行番号は、原因となった PL/SQL ブロック (この場合はパッケージ) を示しています。単純な SQL エラーの場合のように、結合されたスクリプトの行番号ではありません。

これを実行するrun scriptと、参照したエラーだけでなく、3 つのエラーが報告されます。および他の2つは両方とも言及していbeginます:

Errors: check compiler log
6/16           PLS-00103: Encountered the symbol "." when expecting one of the following:

   constant exception <an identifier>
   <a double-quoted delimited-identifier> table long double ref
   char time timestamp interval date binary national character
   nchar
The symbol "<an identifier>" was substituted for "." to continue.

8/3            PLS-00103: Encountered the symbol "END" when expecting one of the following:

   begin function pragma procedure subtype type <an identifier>
   <a double-quoted delimited-identifier> current cursor delete
   exists prior
The symbol "begin was inserted before "END" to continue.

9/13           PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   begin end function pragma procedure

ベンが述べたように、show errors各スペック/ボディ定義の後に追加して、エラーが見られる場所を強調することをお勧めします。user_errorsビューをクエリして、各無効なオブジェクトに関連するエラーを確認することもできます。

于 2015-01-06T08:37:05.583 に答える