GaussDB(DWS) 客户端gsql功能增强之逻辑控制

举报
hhx1003 发表于 2021/07/23 11:15:54 2021/07/23
【摘要】 为了简化数据库SQL脚本的开发模式和执行环境,数据库一般会把数据库交互的功能封装在客户端工具中,用以增加SQL脚本的灵活性,提高脚本的开发效率。 GaussDB(DWS)数据库数据库客户端工具gsql的增强特性包含动态变量、逻辑控制、大小比较、循环体等。通过这些增强特性可以实现流程式的SQL开发,提升数据仓库的SQL作业开发效率。

概述

为了简化数据库SQL脚本的开发模式和执行环境,数据库一般会把数据库交互的功能封装在客户端工具中,用以增加SQL脚本的灵活性,提高脚本的开发效率。

GaussDB(DWS)数据库数据库客户端工具gsql的增强特性包含动态变量逻辑控制大小比较循环体等。通过这些增强特性可以实现流程式的SQL开发,提升数据仓库的SQL作业开发效率。

本篇博文主要介绍gsql的逻辑控制特性。

逻辑控制元命令介绍

\if 条件块:

  1. \if条件块包含四个元命令,即\if \elif \else \endif。
  2. \if \]elif支持bool表达式和大小比较 -- 本博文主要示例bool表法式和等值比较。
  3. 条件块支持嵌套。

\goto \label 跳转元命令:

  1. \label用于创建标签、\goto用于跳转。
  2. 交互模式下不支持。
  3. \label定义在最外层,不建议在事务、PL/SQL语句、\if条件块中使用。
  4. \goto \label后的标签名大小写敏感,只能包含大小写字母、数字和下划线;长度不能超过31,如果超出长度,被截断使用。
  5. \label后的标签名如果重复定义,则报错。

\q [value] 退出命令增加返回值:

  1. \q元命令后可追加退出码,用户可通过自定义退出码判断gsql命令执行状态。
  2. 返回值范围和shell脚本保持一致,如果后面的字符串无法转换为数字则返回值默认为0。

相关固有变量介绍

  1. ERROR:上一个语句执行成功或者失败,取值为true/false。
  2. LAST_ERROR_SQLSTATE: 最近一条语句的错误状态码,如果没有错误,状态码为00000。
  3. LAST_ERROR_MESSAGE:最近一条语句的错误信息,如果没有错误,错误信息为空字符串。
  4. ROW_COUNT:最近执行的一条SQL语句执行的有效记录数,可以通过该变量知道对目标表的记录变动情况(INSERT/DELETE/UPDATE语句)。
  5. SQLSTATE:最近执行的一条SQL语句的状态码。

使用示例1 -- SQL执行错误捕获

select id, name from test_table;
\if ${ERROR}
    \echo 'execute sql error'
    \q 10
\else
    \echo 'get id and name from table'
\endif

create table student (id int, name varchar(32));

执行上述脚本,gsql -d postgres -p 8109 --dynamic-param -f test.sql

gsql:test.sql:1: ERROR:  relation "test_table" does not exist
LINE 1: select id, name from test_table;
                             ^
execute sql error
total time: 1  ms

使用${ERROR}捕获上一条SQL语句执行是否成功,从而控制脚本执行不同分支。

使用示例2 -- shell命令执行错误捕获

\set filename '/home/omm/student.csv'
\! ls ${filename}
\if ${LAST_SYS_CODE} != 0
    \echo 'can not find file(${filename})'
    \q 12
\else
    \set student_data `cat ${filename} | head -n 1`
\endif

\echo 'the first line of ${filename} is:'
\echo ${student_data}

执行上述脚本,gsql -d postgres -p 8109 --dynamic-param -f test.sql

ls: cannot access /home/omm/student.csv: No such file or directory
can not find file(/home/omm/student.csv)

使用${LAST_SYS_CODE}捕获上一条OS命令执行是否成功,从而控制脚本执行不同分支

如果文件存在:

/home/omm/student.csv
the first line of /home/omm/student.csv is:
1       Jack    \N

使用示例3 -- \goto跳转

\set id 3

select id, name from student where id = ${id}
\if ${ROW_COUNT} == 0
    \echo 'can not find student with ID ${id}'
    \goto ERROR_EXIT
\elif ${ROW_COUNT} == 1
    \echo 'the name of student with ID ${id} is ${name}'
\else
    \echo 'find more than ont student with ID ${id}'
    \echo ERROR_EXIT
\endif

\echo 'ID ${id} is unique'
\q 0

\label ERROR_EXIT
\q 12

执行上述脚本,gsql -d postgres -p 8109 --dynamic-param -f test.sql

can not find student with ID 3

使用示例4 -- \if嵌套

\set id 1

select id, name from student_t where id = ${id};
\if ${ERROR}
    select id, name from student;
    \if ${ERROR}
         \echo 'can not get information'
         \goto END
    \endif
    \echo 'id:${id}, name:${name}'
\endif

\label END
\echo 'the end of file'
\q 12

执行上述脚本,gsql -d postgres -p 8109 --dynamic-param -f test.sql

gsql:test.sql:3: ERROR:  relation "student_t" does not exist
LINE 1: select id, name from student_t where id = 1;
                             ^
 id | name
----+------
  1 | Jack
  2 | Rose
(2 rows)

id:1,2, name:Jack,Rose
the end of file

尝试在不同的表中搜索id为1的学生信息,在student_t表中查询不到,继续在student表中查询。


关于逻辑控制的内容先介绍这么多,逻辑控制,结合动态变量、循环体可以实现更灵活的SQL脚本开发,请继续关注GaussDB(DWS) 客户端gsql功能增强系列博文。

往期博文:

GaussDB(DWS) 客户端gsql功能增强之动态变量

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。