Перевод исключений PL / SQL - PullRequest
       40

Перевод исключений PL / SQL

0 голосов
/ 26 сентября 2011

Я вставляю новый объект в таблицу базы данных, но продолжаю извлекать исключение, которое сообщает ....

    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

все точки являются необязательными, поэтому на самом деле не нужны.

Ответы [ 2 ]

3 голосов
/ 26 сентября 2011

Ошибка указывает на наличие синтаксической проблемы рядом с ключевым словом EXCEPTION. Но ваша схема кода не означает, что в любом из ваших блоков есть раздел исключений. Это затрудняет оказание нам большой помощи.

В комментарии вы, кажется, указываете, что по крайней мере один из блоков в вашей структуре имеет раздел исключений. Можете ли вы опубликовать фактический код (или, по крайней мере, более подробный план, включающий синтаксис любого блока исключения, который генерирует ошибку)?

Кроме того, в комментарии звучит так, будто в вашей функции есть оператор RETURN, который возвращает какой-то код состояния. Использование кодов возврата из функций почти всегда является ошибкой - гораздо надежнее просто выбросить исключение (или, что еще лучше, разрешить распространению созданного исключения). Как правило, ошибочно писать в PL / SQL функцию, которая выполняет DML - если вы выполняете DML, вы почти всегда хотите, чтобы это было сделано в процедуре.

0 голосов
/ 26 сентября 2011

Ваша функция не возвращает значение.Я думаю, что вы хотите сделать это ПРОЦЕДУРОЙ (и добавить несколько точек с запятой, ключевое слово "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;

NB. Необходимо добавить раздел исключений для обработки любых распространенных исключений, например, нарушений ограничений и т. Д.

Надеюсь, это поможет

...