南大通用GBase 8a集群存储过程样例,动态存储过程

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自定义函数样例

其它数据库内置函数,请参考

http://www.gbase8.cn/?tag=%e5%87%bd%e6%95%b0

南大通用GBase 8a集群存储过程样例,动态存储过程》有1条评论

评论已关闭。