-2

データベース テーブルに新しいオブジェクトを挿入していますが、... という例外を取得し続けています。

    ERROR:insertproperty:ORA-06553: PLS-103: Encountered the symbol "EXCEPTION" when expecting one of the following:

   begin case declare exit for function goto if loop mod null
   package pragma procedure raise return select separate type
   update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   form table call close current define delete fetch lock insert
   open rollback savepoint set sql execute commit forall merge
ORA-06553: PLS-103: Encountered the symbol "EXCEPTION" when expec

しかし、私がしているのは、単純な挿入だけです...

function insert(...)
begin
    begin 
     select table_seq.nextval
     into nextval 
     from dual

     begin
     insert into table(id, ....)
     values(nextval,....)
     end 
    end
end

ドットはすべてオプションなので、実際には必要ありません。

4

2 に答える 2

3

EXCEPTIONこのエラーは、キーワードの近くに構文上の問題があることを示しています。ただし、コードの概要は、どのブロックにも例外セクションがあることを示していません。それは私たちが多くの援助を提供することをかなり難しくします。

コメントで、アウトラインのブロックの少なくとも1つに例外セクションがあることを示しているようです。実際のコード(または、エラーを生成している例外ブロックの構文を含む、少なくともより詳細なアウトライン)を投稿できますか?

さらに、コメントでは、RETURNある種のステータスコードを返すステートメントが関数にあるようです。関数からの戻りコードを使用することは、ほとんどの場合間違いです。単に例外をスローする方がはるかに堅牢です(または、生成された例外を伝播できるようにすることもできます)。一般に、DMLを実行する関数をPL / SQLで作成するのは間違いです。DMLを実行している場合は、ほとんどの場合、プロシージャで実行する必要があります。

于 2011-09-26T19:29:37.280 に答える
0

関数は値を返しません。あなたはそれをPROCEDUREにしたいと思います(そしていくつかのセミコロン、「AS」キーワードなどを追加します):

CREATE OR REPLACE
PROCEDURE insert_proc(...)
AS
BEGIN
   begin 
      select table_seq.nextval
        into nextval 
        from dual;

      begin
         insert into table(id, ....)
         values(nextval,....);
      end;
   end;
END insert_proc;

Oracle 11gを使用している場合は、DUALテーブルの呼び出しを省略できます。

CREATE OR REPLACE
PROCEDURE insert_proc(...)
AS
BEGIN
   insert into table(id, ....)
   values(nextvatable_seq.nextval,....);
END insert_proc;

注意:制約違反など、発生する可能性のある一般的な例外を処理するために、例外セクションを追加する必要があります。

それが役に立てば幸い

于 2011-09-26T19:21:03.843 に答える