Oracle 编译器流程

Oracle 编译器流程,oracle,plsql,Oracle,Plsql,我不熟悉数据库编程语言。当我读关键词时,比如 RAISE VALUE ERROR 我的理解是,编译器直接进入该事务的异常块 我的问题是,如果后面有一个块具有PRAGMA“autonomousion\u TRANSACTION”当编译器直接转到异常块时,该块如何执行 请您解释一下当使用诸如增值错误,自动交易等关键字时,流程是如何工作的 引发异常与执行GOTO语句完全相同:引发和异常块之间的任何代码都将被忽略 这个演示使用DBMS_输出来显示代码流 SQL> set serveroutput

我不熟悉数据库编程语言。当我读关键词时,比如

RAISE VALUE ERROR
我的理解是,编译器直接进入该事务的异常块

我的问题是,如果后面有一个块具有
PRAGMA“autonomousion\u TRANSACTION”
当编译器直接转到异常块时,该块如何执行


请您解释一下当使用诸如
增值错误
自动交易
等关键字时,流程是如何工作的

引发异常与执行GOTO语句完全相同:引发和异常块之间的任何代码都将被忽略

这个演示使用DBMS_输出来显示代码流

SQL> set serveroutput on
SQL> get auto_txn_demo.sql
  1  begin
  2      dbms_output.put_line('about to raise exception');
  3      raise value_error;
  4      dbms_output.put_line('about to execute anonymous block');
  5      << anon_block >>
  6      declare
  7          procedure auto_txn is
  8              pragma autonomous_transaction;
  9          begin
 10              dbms_output.put_line('executing autonomous transaction');
 11              commit;
 12          end auto_txn;
 13      begin
 14          dbms_output.put_line('about to call private proc');
 15          auto_txn;
 16      end;
 17  exception
 18      when value_error then
 19          dbms_output.put_line('handling exception');
 20* end;
 21  
 22  /
about to raise exception
handling exception

PL/SQL procedure successfully completed.

SQL> 
SQL>打开服务器输出
SQL>get auto_txn_demo.SQL
1开始
2 dbms_output.put_行(“即将引发异常”);
3升值误差;
4 dbms_output.put_line('即将执行匿名块');
5      >
6申报
7程序自动运行
8布拉格自治区交易;
9开始
10 dbms_output.put_line(“执行自治事务”);
11承诺;
12端自动_txn;
13开始
14 dbms_output.put_line('即将调用private proc');
15自动xn;
16端;
17例外情况
18当值_出现错误时
19 dbms_output.put_行(“处理异常”);
20*结束;
21
22  /
即将引发异常
处理异常
PL/SQL过程已成功完成。
SQL>

引发异常与执行GOTO语句完全相同:引发和异常块之间的任何代码都将被忽略

这个演示使用DBMS_输出来显示代码流

SQL> set serveroutput on
SQL> get auto_txn_demo.sql
  1  begin
  2      dbms_output.put_line('about to raise exception');
  3      raise value_error;
  4      dbms_output.put_line('about to execute anonymous block');
  5      << anon_block >>
  6      declare
  7          procedure auto_txn is
  8              pragma autonomous_transaction;
  9          begin
 10              dbms_output.put_line('executing autonomous transaction');
 11              commit;
 12          end auto_txn;
 13      begin
 14          dbms_output.put_line('about to call private proc');
 15          auto_txn;
 16      end;
 17  exception
 18      when value_error then
 19          dbms_output.put_line('handling exception');
 20* end;
 21  
 22  /
about to raise exception
handling exception

PL/SQL procedure successfully completed.

SQL> 
SQL>打开服务器输出
SQL>get auto_txn_demo.SQL
1开始
2 dbms_output.put_行(“即将引发异常”);
3升值误差;
4 dbms_output.put_line('即将执行匿名块');
5      >
6申报
7程序自动运行
8布拉格自治区交易;
9开始
10 dbms_output.put_line(“执行自治事务”);
11承诺;
12端自动_txn;
13开始
14 dbms_output.put_line('即将调用private proc');
15自动xn;
16端;
17例外情况
18当值_出现错误时
19 dbms_output.put_行(“处理异常”);
20*结束;
21
22  /
即将引发异常
处理异常
PL/SQL过程已成功完成。
SQL>

引发异常与执行GOTO语句完全相同:引发和异常块之间的任何代码都将被忽略

这个演示使用DBMS_输出来显示代码流

SQL> set serveroutput on
SQL> get auto_txn_demo.sql
  1  begin
  2      dbms_output.put_line('about to raise exception');
  3      raise value_error;
  4      dbms_output.put_line('about to execute anonymous block');
  5      << anon_block >>
  6      declare
  7          procedure auto_txn is
  8              pragma autonomous_transaction;
  9          begin
 10              dbms_output.put_line('executing autonomous transaction');
 11              commit;
 12          end auto_txn;
 13      begin
 14          dbms_output.put_line('about to call private proc');
 15          auto_txn;
 16      end;
 17  exception
 18      when value_error then
 19          dbms_output.put_line('handling exception');
 20* end;
 21  
 22  /
about to raise exception
handling exception

PL/SQL procedure successfully completed.

SQL> 
SQL>打开服务器输出
SQL>get auto_txn_demo.SQL
1开始
2 dbms_output.put_行(“即将引发异常”);
3升值误差;
4 dbms_output.put_line('即将执行匿名块');
5      >
6申报
7程序自动运行
8布拉格自治区交易;
9开始
10 dbms_output.put_line(“执行自治事务”);
11承诺;
12端自动_txn;
13开始
14 dbms_output.put_line('即将调用private proc');
15自动xn;
16端;
17例外情况
18当值_出现错误时
19 dbms_output.put_行(“处理异常”);
20*结束;
21
22  /
即将引发异常
处理异常
PL/SQL过程已成功完成。
SQL>

引发异常与执行GOTO语句完全相同:引发和异常块之间的任何代码都将被忽略

这个演示使用DBMS_输出来显示代码流

SQL> set serveroutput on
SQL> get auto_txn_demo.sql
  1  begin
  2      dbms_output.put_line('about to raise exception');
  3      raise value_error;
  4      dbms_output.put_line('about to execute anonymous block');
  5      << anon_block >>
  6      declare
  7          procedure auto_txn is
  8              pragma autonomous_transaction;
  9          begin
 10              dbms_output.put_line('executing autonomous transaction');
 11              commit;
 12          end auto_txn;
 13      begin
 14          dbms_output.put_line('about to call private proc');
 15          auto_txn;
 16      end;
 17  exception
 18      when value_error then
 19          dbms_output.put_line('handling exception');
 20* end;
 21  
 22  /
about to raise exception
handling exception

PL/SQL procedure successfully completed.

SQL> 
SQL>打开服务器输出
SQL>get auto_txn_demo.SQL
1开始
2 dbms_output.put_行(“即将引发异常”);
3升值误差;
4 dbms_output.put_line('即将执行匿名块');
5      >
6申报
7程序自动运行
8布拉格自治区交易;
9开始
10 dbms_output.put_line(“执行自治事务”);
11承诺;
12端自动_txn;
13开始
14 dbms_output.put_line('即将调用private proc');
15自动xn;
16端;
17例外情况
18当值_出现错误时
19 dbms_output.put_行(“处理异常”);
20*结束;
21
22  /
即将引发异常
处理异常
PL/SQL过程已成功完成。
SQL>