本发明属于数据库异常处理方法,尤其涉及一种基于opengauss的异常条件处理方法及处理装置。
背景技术:
1、异常处理模块,是数据库系统中一个重要的功能模块,主要用于捕获错误信息,向用户传递引发错误的sql语句和错误条件,以及发生错误后继续执行用户定义的操作。然而,opengauss数据库目前配置的异常处理模块存在诸多不足,例如只能针对报错信息执行退出当前程序块的操作,而不能继续执行后续的程序块sql,同时缺少针对具体错误信息向用户的反馈机制,而且不能根据不同的异常条件进行不同的处理。
技术实现思路
1、为了克服opengauss数据库现有异常处理模块存在的上述不足,本发明提出了一种新的基于opengauss的异常条件处理方法。
2、本发明的目的是为了有效应对存储程序执行过程中可能出现的需要特殊处理的条件,例如在发生异常时退出当前程序块或继续执行后续程序块,异常可能是错误信息也可能是警告信息。利用本发明方法可以在存储过程中发生异常后及时进行异常处理,并根据指定的异常处理条件选择退出当前程序块或继续执行后续程序块,同时在存储过程中用户可以直接写入错误号和错误信息,无须通过sql语句触发异常,从而使异常处理过程更加灵活便捷,方便了用户直接查看错误信息来获取存储过程执行条件。
3、另外,由于发生异常后可能会继续执行后续程序块,因此可能会产生多个异常信息,本发明方法中可以存储当前异常信息和之前的异常信息(堆栈异常信息),供用户查看。
4、具体地,本发明提供了一种基于opengauss的异常条件处理方法,如图1所示,本方法包括以下步骤:
5、s1.异常存储:存储异常信息,存储的异常信息包括sql执行产生的异常信息和异常触发主动写入的异常信息;
6、s2.条件注册:定义错误条件,声明一个条件名并将其与sqlstate进行关联,在后续操作中利用该条件名代替sqlstate使用;通过条件注册,将opengauss中抽象的sqlstate值声明为一个自定义名称,方便了用户理解和使用;
7、s3.异常查询:根据用户指令获取异常存储中的异常信息;
8、s4.异常抛出:对错误特征进行控制,并向处理程序、应用程序(应用程序的外部部分)或客户端返回错误信息;
9、s5.异常传递:传递任务执行过程中产生的错误信息,所述错误信息包括子程序执行中产生的错误信息和异常抛出返回的错误信息;
10、s6.条件处理:指定处理一个或多个错误条件的处理程序,如果出现指定条件之一,则触发异常处理并执行指定的语句。
11、进一步地,本发明基于opengauss的异常条件处理方法步骤s1中所述异常存储的内存上下文是基于session级内存上下文,当session连接断开时,存储的异常信息会被释放。
12、进一步地,本发明基于opengauss的异常条件处理方法步骤s1中所述异常存储在程序执行期间分为当前异常区和堆栈异常区,分别存储当前异常信息和之前的异常信息(堆栈异常信息);
13、如果只有一个异常信息则当前异常区和堆栈异常区存储信息相同,都是当前异常信息;如果有多个异常信息则每触发一个异常都将之前存储在当前异常区的异常信息压入堆栈异常区的栈顶,并用新的异常信息覆盖当前异常区。
14、进一步地,本发明基于opengauss的异常条件处理方法步骤s3中所述异常查询可以指定获取当前异常信息或之前的异常信息(堆栈异常信息),可选择从异常存储的当前异常区或堆栈异常区获取。
15、进一步地,本发明基于opengauss的异常条件处理方法步骤s3中所述异常查询可以获取的信息包括语句信息和异常条件信息;
16、所述语句信息包括可用异常条件的数量和受行影响的行数;
17、获取所述异常条件信息需预先指定条件,然后获取异常存储域中指定条件的相关信息。
18、进一步地,本发明基于opengauss的异常条件处理方法步骤s4中所述的错误特征包括:错误号、sqlstate值、消息;
19、所述异常抛出需预先指定条件,指定的条件是sqlstate值或者是用户在条件注册步骤中声明的条件名,其他的错误信息不指定则按默认值,否则按异常指定值。
20、进一步地,本发明基于opengauss的异常条件处理方法步骤s5中所述的错误信息可能会在传递之前更改部分或全部信息,异常传递过程中虽然会触发条件处理,但不会产生新的异常,异常传递过程仅传递现有异常信息,也包括现有异常信息经修改后的信息。
21、异常传递过程可单独传递当前异常信息,也可以和异常抛出步骤一样发送指定条件和其他的异常信息。
22、进一步地,本发明基于opengauss的异常条件处理方法步骤s6中所述的指定的语句为简单语句或使用begin和end编写的复合语句。
23、进一步地,本发明基于opengauss的异常条件处理方法步骤s6中所述的条件处理可处理用户声明的条件、sqlstate值和以下三个不同sqlstate范围的共有标识:sqlwarning、not found、sqlexception,其中:
24、sqlwarning代表以“01”开头的sqlstate值;not found代表以“02”开头的sqlstate值;sqlexception代表不以“00”、“01”或“02”开头的sqlstate值,“00”开头的sqlstate值是sql执行正常的返回值。
25、进一步地,本发明基于opengauss的异常条件处理方法步骤s6中所述的条件处理过程中触发异常处理的方式包括:sql执行产生异常信息,或直接通过异常抛出返回一个异常信息,或通过异常传递将一个已存在的异常信息重新返回;
26、接收到异常信息后,匹配错误号与指定的异常处理条件,如果匹配不成功则抛出异常;
27、触发异常处理后的处理方式包括:
28、(1)执行完异常处理的程序块后,跳过执行异常sql,继续执行后续程序块中的sql语句;
29、(2)执行完异常处理的程序块后直接退出。
30、另外,本发明还提供了一种计算机可读存储介质,所述存储介质上存储有计算机程序,所述程序被处理器执行时实现上述的基于opengauss的异常条件处理方法的步骤。
31、另一方面,本发明还提供了一种基于opengauss的异常条件处理装置,本装置运行时实现上述的基于opengauss的异常条件处理方法的步骤,本装置包括:
32、异常存储模块:用于存储异常信息,存储的异常信息包括sql执行产生的异常信息和异常触发主动写入的异常信息;
33、条件注册模块:用于定义错误条件,声明一个条件名并将其与sqlstate进行关联,在后续操作中利用该条件名代替sqlstate使用;
34、异常查询模块:用于根据用户指令获取异常存储中的异常信息;
35、异常抛出模块:用于对错误特征进行控制,并向处理程序、应用程序或客户端返回错误信息;
36、异常传递模块:用于传递任务执行过程中产生的错误信息,所述错误信息包括子程序执行中产生的错误信息和异常抛出返回的错误信息;
37、条件处理模块:用于指定处理一个或多个错误条件的处理程序,如果出现指定条件之一,则触发异常处理并执行指定的语句。
38、综上,通过本发明基于opengauss的异常条件处理方法,可在存储过程中当程序块中的sql语句执行产生异常信息时进行及时处理,既可以在执行完异常处理指定的语句后,跳过错误语句继续执行或退出,使存储过程已执行的部分sql正常执行,也可以通过异常抛出、异常传递和异常查询在存储过程执行过程中根据执行的情况进行相应的处理,从而大大提高了异常处理过程的灵活性和操作便捷性,方便了用户直接查看错误信息来获取存储过程执行条件。
1.一种基于opengauss的异常条件处理方法,其特征在于,所述方法包括:
2.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s1中所述异常存储的内存上下文是基于session级内存上下文,当session连接断开时,存储的异常信息会被释放。
3.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s1中所述异常存储在程序执行期间分为当前异常区和堆栈异常区,分别存储当前异常信息和之前的异常信息;
4.根据权利要求3所述的基于opengauss的异常条件处理方法,其特征在于,步骤s3中所述异常查询可以指定获取当前异常信息或之前的异常信息,可选择从异常存储的当前异常区或堆栈异常区获取。
5.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s3中所述异常查询可以获取的信息包括语句信息和异常条件信息;
6.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s4中所述的错误特征包括:错误号、sqlstate值、消息;
7.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s6中所述的指定的语句为简单语句或使用begin和end编写的复合语句。
8.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s6中所述的条件处理可处理用户声明的条件、sqlstate值和以下三个不同sqlstate范围的共有标识:sqlwarning、not found、sqlexception,其中:
9.根据权利要求1所述的基于opengauss的异常条件处理方法,其特征在于,步骤s6中所述的条件处理过程中触发异常处理的方式包括:sql执行产生异常信息,或直接通过异常抛出返回一个异常信息,或通过异常传递将一个已存在的异常信息重新返回;
10.一种基于opengauss的异常条件处理装置,其特征在于,所述装置运行时实现权利要求1-9任一项所述的基于opengauss的异常条件处理方法的步骤,所述装置包括: