-1

私は Oracle を初めて使用し、この問題を経験しています。

次のような手順を作成しました。

CREATE OR REPLACE PROCEDURE getArt 
as
begin
    select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName 
      from hng_art ar 
           join HNG_ACCOUNTS ac 
             on ar.accNo = ac.accNo 
     order by ar.artNo desc
end getArt;

SELECT ステートメントを個別に実行しようとしましたが、うまくいきました。しかし、手続きに入れると。私は働きませんでした。エラーは次のとおりです。

「GETART」のエラー

ERROR at line 4: PL/SQL: SQL Statement ignored
ERROR at line 4: PL/SQL: ORA-00933: SQL command not properly ended
ERROR at line 5: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:     ; 

ありがとうございました

4

1 に答える 1

4

いくつかのエラー。

現時点では、コンパイラは、selectステートメントの後にセミコロンがないという事実に反対しています。PL/SQL のすべてのステートメントは、セミコロンで終了する必要があります。

selectこれを修正すると、ストアド プロシージャは単純にステートメントを実行できないため、エラーが発生します。結果に応じて何かをしなければなりません。クエリが常に正確に 1 つの行を返すことがわかっている場合は、いくつかのローカル変数を宣言し、select intoそれらの変数を設定するために a を実行できます。ただし、クエリが複数の行を返す可能性があると推測しています。プロシージャにループを記述forし、結果を反復処理して、行で何かを行うことができます。OUTまたは、 type のパラメーターを持つようにプロシージャーを宣言しSYS_REFCURSOR、クエリのカーソルを開き、そのカーソルを呼び出し元に返すこともできます。12.1以降を使用している場合、Oracleは構文糖衣を少し導入しているため、プロシージャはそのような宣言をせずに結果を返すことができますOUTパラメータですが、それはおそらくあなたがいる状況ではないと思います.

構文的には、次のようなことができます

CREATE OR REPLACE PROCEDURE getArt( p_rc OUT sys_refcursor )
as
begin
  open p_rc
   for  
    select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName 
      from hng_art ar 
           join HNG_ACCOUNTS ac 
             on ar.accNo = ac.accNo 
     order by ar.artNo desc;
end getArt;

ただし、それは合法ですが、特に慣用的なものではありません。ステートメントを実行するだけのコードがある場合はselect、通常、ストアド プロシージャよりもビューを作成する方がはるかに理にかなっています。結果を返す前に大量の PL/SQL 処理を行っている場合は、パイプライン化されたテーブル関数が適している場合があります。

于 2014-11-08T06:59:45.643 に答える