【问题标题】:PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: " := . ( @ % ;"PLS-00103:在期待以下之一时遇到符号“BEGIN”:“:= . (@% ;”
【发布时间】:2020-10-22 17:14:20
【问题描述】:

我有这个代码

BEGIN TRANSACTION 
BEGIN TRY
 
        INSERT INTO table2 (field1, field2, field3, field4)
        SELECT '1', field2, field3, field4
        FROM table1

COMMIT 
 
END TRY

BEGIN CATCH

ROLLBACK TRANSACTION

END CATCH

我得到以下错误

    SQL Error [6550] [65000]: ORA-06550: line 2, column 2:
PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:

   := . ( @ % ;

我已经尝试并查找了有关同一主题的多个问题,但我找不到答案,也许这里有什么问题。使用 ;在每句话之后给我不同的错误

更新:

以下错误信息以该代码结尾:

BEGIN TRANSACTION;
    BEGIN TRY;
     
            INSERT INTO table2 (field1, field2, field3, field4)
            SELECT '1', field2, field3, field4
            FROM table1
    
    COMMIT ;
     
    END TRY;
    
    BEGIN CATCH;
    
    ROLLBACK TRANSACTION;
    
    END CATCH;

还有以下错误:

    SQL Error [6550] [65000]: ORA-06550: line 13, column 10:
PL/SQL: ORA-02181: invalid option to ROLLBACK WORK
ORA-06550: line 13, column 1:
PL/SQL: SQL Statement ignored
ORA-06550: line 15, column 10:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   ( begin case declare end exception exit for goto if loop mod
   null pragma raise return select update while with
   <an identifier> <a double-quote

【问题讨论】:

    标签: sql database oracle transactions


    【解决方案1】:

    您发布的代码不是 Oracle,而您收到的错误消息,所以我认为您确实使用Oracle。在这种情况下,你会

    begin
      insert into table2 (field1, field2, field3, field4)
      select '1', filed2, field3, field4
      from table1;
      
      commit;
    end;
    /
    

    如果出现错误,实际上不会插入任何内容,因此无需回滚。如果你愿意,你可以处理异常,例如

    begin
      insert into table2 (field1, field2, field3, field4)
      select '1', filed2, field3, field4
      from table1;
      
      commit;
    
    exception
      when dup_val_on_index then
        null;
      when others then
        raise;
    end;
    

    【讨论】:

    • 谢谢,如果出现任何错误,是否会回滚而不需要更多代码?
    • 我刚刚编辑了邮件并添加了更多信息。请看一下。
    • 您的新编辑让我感觉我的代码没有达到我想要的效果,我假装做的是将表中多行中的多个字段插入到多个新行中在第二个表中。如果这些行之一给我一些错误,回滚整个过程。
    • 未捕获异常的默认行为是回滚打开的事务,报告错误并返回失败。因此我不喜欢when others then raise;,因为它会污染错误堆栈。
    【解决方案2】:

    请一一解决错误。对于您提到的错误,保留一个';'在“BEGIN TRANSACTION”之后编译和检查。然后根据进一步的错误,您可以检查需要修复哪一行,或者需要修复什么错误。希望该方法有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2014-09-18
      相关资源
      最近更新 更多