GaussDB(DWS) 客户端gsql功能增强之逻辑控制
概述
为了简化数据库SQL脚本的开发模式和执行环境,数据库一般会把数据库交互的功能封装在客户端工具中,用以增加SQL脚本的灵活性,提高脚本的开发效率。
GaussDB(DWS)数据库数据库客户端工具gsql的增强特性包含动态变量、逻辑控制、大小比较、循环体等。通过这些增强特性可以实现流程式的SQL开发,提升数据仓库的SQL作业开发效率。
本篇博文主要介绍gsql的逻辑控制特性。
逻辑控制元命令介绍
\if 条件块:
- \if条件块包含四个元命令,即\if \elif \else \endif。
- \if \]elif支持bool表达式和大小比较 -- 本博文主要示例bool表法式和等值比较。
- 条件块支持嵌套。
\goto \label 跳转元命令:
- \label用于创建标签、\goto用于跳转。
- 交互模式下不支持。
- \label定义在最外层,不建议在事务、PL/SQL语句、\if条件块中使用。
- \goto \label后的标签名大小写敏感,只能包含大小写字母、数字和下划线;长度不能超过31,如果超出长度,被截断使用。
- \label后的标签名如果重复定义,则报错。
\q [value] 退出命令增加返回值:
- \q元命令后可追加退出码,用户可通过自定义退出码判断gsql命令执行状态。
- 返回值范围和shell脚本保持一致,如果后面的字符串无法转换为数字则返回值默认为0。
相关固有变量介绍
- ERROR:上一个语句执行成功或者失败,取值为true/false。
- LAST_ERROR_SQLSTATE: 最近一条语句的错误状态码,如果没有错误,状态码为00000。
- LAST_ERROR_MESSAGE:最近一条语句的错误信息,如果没有错误,错误信息为空字符串。
- ROW_COUNT:最近执行的一条SQL语句执行的有效记录数,可以通过该变量知道对目标表的记录变动情况(INSERT/DELETE/UPDATE语句)。
- 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功能增强系列博文。
往期博文:
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~
- 点赞
- 收藏
- 关注作者
评论(0)