pgsql -- sys_guid()

本文介绍如何在数据库中使用sys_guid()函数生成唯一标识符,并演示了如何将其用于INSERT语句中,以自动为新记录分配一个全局唯一的ID。
部署运行你感兴趣的模型镜像

数据库查询sys_guid(): select sys_guid();

使用:

insert into user (id, username) values (sys_guid(),‘刘德华’);

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

# 存储过程实现 SQL 自动化执行与异常处理机制说明 ## 一、背景介绍 在大型数据库系统中,SQL语句的自动化执行是提升数据操作效率的重要手段。然而,在实际执行过程中,SQL语句可能会因为语法错误、权限问题、数据异常等原因导致执行失败。为了确保任务的稳定性与可追溯性,我们设计了一个具备异常捕获与日志记录功能的存储过程,实现自动化执行的同时,能够防止失败导致的中断,并提供详细的错误信息反馈。 ## 二、功能概述 该存储过程名为 `p_execute_sql`,属于模式 `omp`,其核心功能是接收一个动态 SQL 字符串作为输入参数,动态执行该 SQL,并在执行失败时自动记录错误信息到日志表中,同时保证事务的完整性。 ## 三、存储过程结构详解 ### 1. 函数定义 ```sql CREATE OR REPLACE FUNCTION "omp"."p_execute_sql"("dynamicsql" text) RETURNS "pg_catalog"."void" AS $BODY$ ``` - `CREATE OR REPLACE FUNCTION`:创建或替换函数; - `"omp"."p_execute_sql"`:函数名,属于模式 `omp`; - `"dynamicsql" text`:输入参数,用于接收动态 SQL; - `RETURNS "pg_catalog"."void"`:表示该函数不返回值; - `$BODY$`:函数体的起始与结束标记。 ### 2. 声明与执行部分 ```sql DECLARE BEGIN execute dynamicSql; commit; ``` - `execute dynamicSql;`:动态执行传入的 SQL; - `commit;`:提交事务,确保执行结果持久化。 ### 3. 异常处理部分 ```sql EXCEPTION WHEN others THEN INSERT INTO t_datachange_execption_sql_log( id, exec_time, EXEC_STATUS, EXEC_SQL, EXEC_ERROR ) VALUES ( sys_guid(), now(), '失败', dynamicSql, SQLERRM ); RAISE INFO 'in exception %', SQLERRM; end$BODY$ ``` - `EXCEPTION WHEN others THEN`:捕获所有异常; - `INSERT INTO t_datachange_execption_sql_log(...)`:将失败的 SQL 及错误信息记录到日志表; - `sys_guid()`:生成唯一标识; - `now()`:获取当前时间; - `SQLERRM`:获取当前错误信息; - `RAISE INFO`:输出错误信息到控制台,便于调试; - `END`:结束函数体。 ## 四、相关依赖对象说明 ### 1. 日志表 `t_datachange_execption_sql_log` 该表用于记录执行失败的 SQL 信息,建议包含以下字段: | 字段名 | 数据类型 | 说明 | |---------------|--------------|--------------------| | id | VARCHAR/UUID | 唯一标识 | | exec_time | TIMESTAMP | 执行时间 | | EXEC_STATUS | VARCHAR | 执行状态(成功/失败) | | EXEC_SQL | TEXT | 执行的 SQL | | EXEC_ERROR | TEXT | 错误信息 | ### 2. 函数 `sys_guid()` OpenGauss 提供的生成唯一标识符的函数,用于保证日志记录的唯一性。 ## 五、完整代码 ### 第一个代码段(OpenGauss) ```sql -- 创建或替换函数 p_execute_sql,属于模式 omp,接收一个文本类型的参数 dynamicsql -- 该函数无返回值(void) CREATE OR REPLACE FUNCTION "omp"."p_execute_sql"("dynamicsql" text) RETURNS "pg_catalog"."void" AS $BODY$ DECLARE BEGIN -- 执行传入的动态 SQL 语句 execute dynamicSql; -- 提交事务,确保更改写入数据库 commit; -- 异常处理模块,捕获所有未处理的异常 EXCEPTION WHEN others THEN -- 向异常日志表插入错误信息 INSERT INTO t_datachange_execption_sql_log( id, exec_time, EXEC_STATUS, EXEC_SQL, EXEC_ERROR ) VALUES ( -- 生成唯一 ID sys_guid(), -- 记录当前时间 now(), -- 执行状态标记为“失败” '失败', -- 保存出错的 SQL 语句 dynamicSql, -- 保存错误信息 SQLERRM ); -- 输出错误信息到日志或控制台,便于调试 RAISE INFO 'in exception %', SQLERRM; -- 函数结束 end$BODY$ -- 指定使用 PL/pgSQL 语言,VOLATILE 表示该函数可能修改数据库状态 LANGUAGE plpgsql VOLATILE -- 成本估算为 100 COST 100; ``` ### 第二个代码段(MySQL) ```sql -- 创建或替换一个由 hisAdmin@% 定义的存储过程 P_EXECUTE_SQL -- 输入参数为 strDynamicSql,类型为 text,表示待执行的 SQL 语句 CREATE DEFINER=`hisAdmin`@`%` PROCEDURE `P_EXECUTE_SQL`(IN `strDynamicSql` text) BEGIN -- 声明变量 RESULT_CODE 用于记录执行结果状态,默认值为 0(表示成功) DECLARE RESULT_CODE INTEGER DEFAULT 0; -- 声明变量 MSG 用于保存异常信息 DECLARE MSG TEXT; -- 定义 SQLEXCEPTION 异常处理程序,当 SQL 出现异常时进入该处理块 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION begin -- 获取异常的具体信息并赋值给 MSG GET DIAGNOSTICS CONDITION 1 MSG = MESSAGE_TEXT; -- 设置执行状态为异常(RESULT_CODE = 1) SET RESULT_CODE= 1; -- 向异常日志表插入失败记录 INSERT INTO t_datachange_execption_sql_log( id, exec_time, EXEC_STATUS, EXEC_SQL, EXEC_ERROR ) VALUES ( default, -- id 使用默认值(如自增主键) now(), -- 记录当前时间 '失败', -- 执行状态标记为失败 strDynamicSql, -- 执行失败的 SQL CONCAT('异常信息:',MSG) -- 拼接异常信息 ); end; -- 将传入的 SQL 赋值给预定义变量 @dynamicSql SET @dynamicSql = strDynamicSql; -- 预编译 SQL 语句,准备执行 PREPARE stemt1 from @dynamicSql; -- 执行预编译的 SQL 语句 EXECUTE stemt1; -- 释放预编译资源 deallocate prepare stemt1; -- 判断执行是否出错,如果没有出错则提交事务 IF RESULT_CODE != 1 THEN COMMIT; END IF; END ``` 1、不要更改我的内容,帮我排版 2、排版中所有标题前加上图标 3、能用表格展示的尽量用表格展示
最新发布
08-11
```sql -- 创建或替换函数 p_execute_sql,属于模式 omp,接收一个文本类型的参数 dynamicsql -- 该函数无返回值(void) CREATE OR REPLACE FUNCTION "omp"."p_execute_sql"("dynamicsql" text) RETURNS "pg_catalog"."void" AS $BODY$ DECLARE BEGIN -- 执行传入的动态 SQL 语句 execute dynamicSql; -- 提交事务,确保更改写入数据库 commit; -- 异常处理模块,捕获所有未处理的异常 EXCEPTION WHEN others THEN -- 向异常日志表插入错误信息 INSERT INTO t_datachange_execption_sql_log( id, exec_time, EXEC_STATUS, EXEC_SQL, EXEC_ERROR ) VALUES ( -- 生成唯一 ID sys_guid(), -- 记录当前时间 now(), -- 执行状态标记为“失败” '失败', -- 保存出错的 SQL 语句 dynamicSql, -- 保存错误信息 SQLERRM ); -- 输出错误信息到日志或控制台,便于调试 RAISE INFO 'in exception %', SQLERRM; -- 函数结束 end$BODY$ -- 指定使用 PL/pgSQL 语言,VOLATILE 表示该函数可能修改数据库状态 LANGUAGE plpgsql VOLATILE -- 成本估算为 100 COST 100; ``` ```sql -- 创建或替换一个由 hisAdmin@% 定义的存储过程 P_EXECUTE_SQL -- 输入参数为 strDynamicSql,类型为 text,表示待执行的 SQL 语句 CREATE DEFINER=`hisAdmin`@`%` PROCEDURE `P_EXECUTE_SQL`(IN `strDynamicSql` text) BEGIN -- 声明变量 RESULT_CODE 用于记录执行结果状态,默认值为 0(表示成功) DECLARE RESULT_CODE INTEGER DEFAULT 0; -- 声明变量 MSG 用于保存异常信息 DECLARE MSG TEXT; -- 定义 SQLEXCEPTION 异常处理程序,当 SQL 出现异常时进入该处理块 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION begin -- 获取异常的具体信息并赋值给 MSG GET DIAGNOSTICS CONDITION 1 MSG = MESSAGE_TEXT; -- 设置执行状态为异常(RESULT_CODE = 1) SET RESULT_CODE= 1; -- 向异常日志表插入失败记录 INSERT INTO t_datachange_execption_sql_log( id, exec_time, EXEC_STATUS, EXEC_SQL, EXEC_ERROR ) VALUES ( default, -- id 使用默认值(如自增主键) now(), -- 记录当前时间 '失败', -- 执行状态标记为失败 strDynamicSql, -- 执行失败的 SQL CONCAT('异常信息:',MSG) -- 拼接异常信息 ); end; -- 将传入的 SQL 赋值给预定义变量 @dynamicSql SET @dynamicSql = strDynamicSql; -- 预编译 SQL 语句,准备执行 PREPARE stemt1 from @dynamicSql; -- 执行预编译的 SQL 语句 EXECUTE stemt1; -- 释放预编译资源 deallocate prepare stemt1; -- 判断执行是否出错,如果没有出错则提交事务 IF RESULT_CODE != 1 THEN COMMIT; END IF; END ``` 这两个哪一个是MySQL的
08-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值