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 ;

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/318208.html

(0)
上一篇 4小时前
下一篇 4小时前

相关推荐

发表回复

登录后才能评论