GBase 8a 数据库可以执行一个拼接的字符串,当成SQL来执行。通过parpare方式编译,execute执行,再通过DEALLOCATE释放掉资源。
注意:存储过程在执行时,call 语句会被审计日志记录,一旦执行开始,在show processlist时,将只能看到内部的SQL,看不到call语句,且这些内部SQL不会被审计日志记录。
目录导航
一个通用的存储规程来执行executeSQL
其中存储过程是一个整体,所以必须用delimiter 执行一个新的分割符。 在分隔符出现前,所有的内容为一个整体。 如下例子用//作为分割。
在存储过程编写完成后,加上//作为结束。 然后指定新的分隔符, 如下例子恢复了默认的分号作为分割。
drop procedure if exists executeSQL;
delimiter //
create procedure executeSQL(
S_SQL_TMP VARCHAR(21000)
)
BEGIN
set @executeSQL_sql = S_SQL_TMP;
PREPARE executeSQL_s1 FROM @executeSQL_sql ;
EXECUTE executeSQL_s1;
DEALLOCATE PREPARE executeSQL_s1;
END//
delimiter ;
执行测试
gbase> call executeSQL('show tables');
+------------------+
| Tables_in_testdb |
+------------------+
| hr |
| human |
| t_ms |
| t_varchar |
| t_varchar2 |
| testboolean |
| testload |
| tload |
| tload_2 |
+------------------+
9 rows in set (Elapsed: 00:00:00.00)
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
带异常处理的存储规程
错误处理分为继续continue和 退出exit两类,如下是continue的例子。获得异常信息的代码可以使用,其它可以写各种处理方案,下面也只是一个写入日志的例子。
drop procedure if exists executeSQL;
delimiter //
create procedure executeSQL(
S_SQL_TMP VARCHAR(21000)
)
BEGIN
declare errno int;
declare msg text;
declare continue handler for sqlexception
begin
get diagnostics condition 1 errno = gbase_errno,msg = message_text;
create table if not exists err_msg(errno int, msg varchar(10000),d datetime);
insert into err_msg values (errno,msg,now());
end;
set @sql = S_SQL_TMP;
PREPARE s1 FROM @sql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
END//
delimiter ;
自定义函数的样例,请参考
其它数据库内置函数,请参考
《南大通用GBase 8a集群存储过程样例,动态存储过程》有1条评论
评论已关闭。