4

4 つの関数を含むパッケージを作成しようとしています。各関数は一連の数値を加算し、合計から 1 を減算します。私は構文を正しくするのに多くの苦労をしてきました。以下の関数は単独で動作し、最後に最初の関数を呼び出してみます。

パッケージを作成しようとすると、7 行目で「次のいずれかを期待するときにシンボル "END" に遭遇しました: begin 関数プラグマ プロシージャ サブタイプ タイプ 現在のカーソル削除は 0.05 秒前に存在します」というエラーが表示されます。

パッケージ本体には、「名前は既存のオブジェクトによって既に使用されています」と書かれています。とにかくパッケージの仕様で宣言する必要があるため、わかりません.functionbyfourという名前のパッケージが既に存在するというエラーが発生した場合、作成または置換でこれを解決する必要があります.

そして最後に、パッケージ内の関数を使用しようとすると、「次のいずれかが期待されているときに記号 "BEGIN" が発生しました: := . ( @ % ; null 範囲のデフォルト文字ではなく、記号 ";" が置換されました。 "BEGIN" to continue. ORA-06550: 行 5、列 43: PLS-00103: シンボル "FROM" が次のいずれかを期待しているときに検出されました: . ( * % & = - + ; < / > at in は mod 剰余rem <> または != または ~= >= <= <> およびまたは like2 like4 likec between || multiset me".

私は ORACLE EXPRESS エディション 11g を使用しており、PL/SQL は初めてです (4 週間)。

どんな入力でも大歓迎です。

CREATE OR REPLACE FUNCTION functionbyfour AS

 FUNCTION functone( first number, second number) RETURN NUMBER ;
 FUNCTION functtwo( first number, second number, third number) RETURN NUMBER ;
 FUNCTION functthree(first number, second number, third number, fourth number) RETURN     NUMBER ;
 FUNCTION functfour( first number, second number, third number, fourth number,fifth   number) RETURN NUMBER ;

END  functionbyfour;
/

CREATE OR REPLACE PACKAGE functionbyfour AS

FUNCTION functone (first number, second number ) RETURN number AS total number;
 BEGIN
total:=first + second – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functone;


FUNCTION functtwo (first number, second number, third number ) RETURN number AS  total     number;
BEGIN
total:=first + second + third – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functtwo;

FUNCTION functthree (first number, second number,third number, fourth number )     RETURN     number AS total number;
BEGIN
total:=first + second + third + fourth – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functthree;


FUNCTION functfour (first number, second number, third number, fourth number, fifth     number ) RETURN number AS total number;
BEGIN
total:=first + second + third + fourth + fifth – 1;
RETURN total;
DBMS_OUTPUT.PUT_LINE(total);
END functfour;

/

BEGIN

SELECT functionbyfour.functone(1,2) FROM DUAL;

END;

/ </p>

4

3 に答える 3

9

FunctionByFour( CREATE OR REPLACE PACKAGE)という名前のパッケージを作成する必要があります

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE PACKAGE functionbyfour AS
  2   FUNCTION functone( first number, second number) RETURN NUMBER ;
  3   FUNCTION functtwo( first number, second number, third number) RETURN NUMBER ;
  4   FUNCTION functthree(first number, second number, third number, fourth number) RETURN     NUMBER ;
  5   FUNCTION functfour( first number, second number, third number, fourth number,fifth   number) RETURN NUMBER ;
  6* END  functionbyfour;
  7  /

Package created.

そして、対応するパッケージ本体 ( CREATE OR REPLACE PACKAGE BODY)。パッケージ本体にも が必要ですEND(現在、コードは 4 番目の関数の最後で終了しています)。

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE PACKAGE BODY functionbyfour AS
  2    FUNCTION functone (first number, second number ) RETURN number AS total number;
  3    BEGIN
  4      total:=first + second - 1;
  5      RETURN total;
  6      DBMS_OUTPUT.PUT_LINE(total);
  7    END functone;
  8    FUNCTION functtwo (first number, second number, third number ) RETURN number AS  total     number;
  9    BEGIN
 10      total:=first + second + third - 1;
 11      RETURN total;
 12      DBMS_OUTPUT.PUT_LINE(total);
 13    END functtwo;
 14    FUNCTION functthree (first number, second number,third number, fourth number )     RETURN     number AS total number;
 15    BEGIN
 16      total:=first + second + third + fourth - 1;
 17      RETURN total;
 18      DBMS_OUTPUT.PUT_LINE(total);
 19    END functthree;
 20    FUNCTION functfour (first number, second number, third number, fourth number, fifth     number ) RETURN number AS total number;
 21    BEGIN
 22      total:=first + second + third + fourth + fifth - 1;
 23      RETURN total;
 24      DBMS_OUTPUT.PUT_LINE(total);
 25    END functfour;
 26* END functionbyfour;
SQL> /

Package body created.

それが完了したら、関数を使用できます

SQL> SELECT functionbyfour.functone(1,2) FROM DUAL;

FUNCTIONBYFOUR.FUNCTONE(1,2)
----------------------------
                           2

ステートメントを PL/SQL ブロックに入れSELECTたい場合は、ローカル変数を宣言し、ローカル変数SELECT INTOに関数の結果を移入する必要があります (ローカル変数に関数の結果を代入することもできます)。を使用する必要のない関数呼び出しSELECT)。

SQL> ed
Wrote file afiedt.buf

  1  DECLARE
  2    l_result NUMBER;
  3  BEGIN
  4    -- First approach
  5    l_result := functionByFour.functOne(1,2);
  6    dbms_output.put_line( l_result );
  7    -- Second approach
  8    SELECT functionByFour.functOne(1,2)
  9      INTO l_result
 10      FROM dual;
 11    dbms_output.put_line( l_result );
 12* END;
 13  /
2
2

PL/SQL procedure successfully completed.

また、あなたの声明のDBMS_OUTPUT.PUT_LINE後に置くことは無意味であることに注意してください. RETURNそのコードには決して到達できません。結果をDBMS_OUTPUTバッファに出力したい場合は、RETURN.

于 2013-04-16T15:57:10.903 に答える
4
  1. この線

    CREATE OR REPLACE FUNCTION functionbyfour AS
    

    する必要があります

    CREATE OR REPLACE PACKAGE functionbyfour AS
    
  2. この線

    CREATE OR REPLACE PACKAGE functionbyfour AS
    

    する必要があります

    CREATE OR REPLACE PACKAGE BODY functionbyfour AS
    
  3. second という単語はキーワードであり、パラメーター名として使用することはできません

  4. が必要です

    END functionbyfour;
    

    END functionfour の後、パッケージ本体を終了します

  5. あなたの dbms_outputs は、リターン後にそのまま実行されることはありません

  6. これらすべてを 1 つの関数で実行できます

     FUNCTION functall(FIRST NUMBER
                         ,sec NUMBER DEFAULT 0
                         ,third NUMBER DEFAULT 0
                         ,fourth NUMBER DEFAULT 0
                         ,fifth NUMBER DEFAULT 0)
      RETURN NUMBER
    AS
      total NUMBER;
    BEGIN
      total := first + sec + third + fourth + fifth - 1;
    
      dbms_output.PUT_LINE(total);
    
      RETURN total;
    END functall;
    
  7. 何がしたいのは奇妙なことですか?:-)

于 2013-04-16T16:10:40.130 に答える
3

スタンドアロンのプログラムとパッケージについて混乱しています。

CREATE FUNCTION は、スタンドアロン関数の作成にのみ使用できます。あなたが持っているものは次のとおりです。

CREATE OR REPLACE PACKAGE functionbyfour AS

パッケージは、仕様書と本体の 2 つの部分で構成されます。仕様は API の公開面であり、本体は実装です。パッケージ(スペック)として持っているものがパッケージ本体です。コードの 2 番目のチャンクを開始するように変更します。

CREATE OR REPLACE PACKAGE BODY functionbyfour AS

少なくとも、プログラムを正しく構造化できます。

Oracle PL/SQL のドキュメントは、オンラインで包括的かつ無料です。ぜひ読んでいただきたいです。 詳細をご覧ください

于 2013-04-16T15:51:51.060 に答える