VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

TRY CATCH

功能描述

Vastbase G100在SQL Server兼容模式下,支持使用TRY CATCH捕捉异常。Transact-SQL语句组可以包含在 TRY 块中。 如果 TRY 块内部发生错误,则会将控制传递给 CATCH 块中包含的另一个语句组。

语法格式

BEGIN TRY; --进入TRY块
TRY块SQL
END TRY BEGIN CATCH; --离开TRY块进入CATCH块
CATCH块SQL
END CATCH; --离开CATCH块

注意事项

  • 该功能仅在数据库兼容模式为SQL Server时能够使用(即创建DB时DBCOMPATIBILITY='MSSQL'),在其他数据库兼容模式下不能使用该特性。
  • 仅支持按照BEGIN TRY、END TRY BEGIN CATCH、END CATCH 的流程进行,不支持中间插入任何与事务相关的语句(如BEGIN、COMMIT、SAVEPOINT)。
  • 不支持嵌套。
  • 不支持在存储过程/函数中使用。
  • 如果 TRY 块所包含的代码中有错误,则会将控制传递给相关联的 CATCH 块的第一个语句。当 CATCH 块中的代码完成时,会将控制传递给紧跟在 END CATCH 语句之后的语句。
  • 由 CATCH 块捕获的错误不会返回到调用应用程序。如果错误消息的任何部分都必须返回到应用程序,则 CATCH 块中的代码必须使用 SELECT 结果集或 RAISERROR 和 PRINT 语句之类的机制执行此操作。

示例

1、创建兼容模式为SQL Server的库db_sqlserver,并进入。

CREATE DATABASE db_sqlserver DBCOMPATIBILITY='MSSQL';
\c db_sqlserver

2、创建测试表并插入数据。

CREATE TABLE products_1132917(
ProductID int,
Name varchar,
Price int,
Quantity int);
INSERT INTO products_1132917 values(101, 'Laptop', 15000, 100);
INSERT INTO products_1132917 values(102, 'Desktop', 20000, 150);
INSERT INTO products_1132917 values(104, 'Mobile', 3000, 200);
INSERT INTO products_1132917 values(105, 'Tablet', 4000, 250);

3、在表上创建唯一索引。

CREATE UNIQUE INDEX idx_1132917 on products_1132917(ProductID);

4、使用TRY块中插入失败,进入到CATCH块中执行插入成功。

BEGIN TRY;
INSERT INTO products_1132917 values(105, 'Airpods', 1000, 300);
END TRY BEGIN CATCH;
INSERT INTO products_1132917 values(107, 'Airpods', 1000, 300);
END CATCH;

5、查看表中插入数据。

SELECT * FROM products_1132917;

结果返回如下:

 productid |  name   | price | quantity
-----------+---------+-------+----------
       101 | Laptop  | 15000 |      100
       102 | Desktop | 20000 |      150
       104 | Mobile  |  3000 |      200
       105 | Tablet  |  4000 |      250
       107 | Airpods |  1000 |      300
(5 rows)