1

Java で Oracle ストアド プロシージャを呼び出すことができません。次のようにストアド プロシージャをデータベースに追加しました。

         String SQL = "CREATE OR REPLACE PROCEDURE LIVERESULTS() " +
                    "IS " +
                    "BEGIN" +
                            " SELECT POOL_ID, POOL_MBR_ID, BSLN_CD, PGE_TYP_NM, SERV_NM, CL_FILE_NM" +
                            " FROM LBMADM.TPPO_MSTR_MAP " +
                            " ORDER BY SERV_NM" +
                            " WHERE PGE_TYP_NM = 'live' ; " +
                    "END";

                    stmtLIVE = con.createStatement();
                    stmtLIVE.executeUpdate(SQL);

そして今、私はそれを次のように呼び出そうとしています:

CallableStatement cs;

                 try {
                         cs = con.prepareCall("{call LIVERESULTS() }");
                         rs = cs.executeQuery();

                         while (rs.next()) {
 .....

ただし、次のエラーが発生します。

 java.sql.SQLException: ORA-06550: line 1, column 7:
 PLS-00905: object UT9J.GENERATE_SQL_FOR_LIVE is invalid
 ORA-06550: line 1, column 7:
 PL/SQL: Statement ignored

どこが間違っているのかよくわかりません。私はそれに関する Oracle のドキュメントを読み、すべてを正しく行ったと思いますが、そうではないと思います。誰かが状況に光を当てることができれば、本当に感謝しています。

4

4 に答える 4

4

LIVE無効な SP に INTO 句のない SELECT STATEMENT があるため、ストアド プロシージャはエラーなしではコンパイルされません。

したがって、問題。結果セットを返すには、REF CURSOR を使用します。

于 2011-07-22T13:39:25.987 に答える
2

すべて良い他の答えに加えて...

CREATE PROCEDUREは SQLException を発生させないため、プロシージャが正常にコンパイルされることを期待している可能性があります。しかし、これは SQL ステートメントとして成功したこと、つまりプロシージャーが作成されたことを示しているだけです。次に、プロシージャを PL/SQL コードとしてコンパイルする必要がありますが、他の人が指摘したさまざまな構文エラーが原因で失敗しています。この状況では、プロシージャーが作成されるため、SQL は成功しますが、エラーが発生して無効になります。

SQL*Plus などの Oracle 固有のツールはこれを認識しており、Rajesh の回答に示されているように、適切なフィードバック (「コンパイル エラーで作成されたプロシージャ」) を表示します。JDBC はこれを自動的にチェックしません。本当に Java から作成する必要がある場合は、 : を実行した後、すぐにエラーを確認する必要がありCREATEます SELECT * FROM USER_ERRORS WHERE NAME='LIVERESULTS'。これにより、SQL*PlusSHOW ERRORSコマンドで表示される情報と本質的に同じ情報が返されます。

プロシージャをコールする前に、PL/SQL コンパイル エラーを解決する必要があります。

于 2011-07-22T17:05:18.863 に答える
0

IS[required] (または 'AS')がありません

CREATE OR REPLACE PROCEDURE LIVE() 
IS 
BEGIN
   <the body here> 
END;

[編集]

于 2011-07-22T13:40:12.743 に答える