#SET TERMINATOR语句作用是什么?是否需在每个SQL存储过程开头添加?
#SET TERMINATOR 语句常见问题解答
1. 具体作用
该语句是SQL客户端工具(比如Db2命令行处理器、部分兼容SQL的数据库管理工具)的预处理指令,作用是修改SQL语句的默认终止符。
SQL默认的语句终止符是分号;,但存储过程内部的业务逻辑语句(比如查询、增删改、分支循环逻辑等)本身就需要使用分号作为结尾。如果不修改全局终止符,客户端解析代码时遇到存储过程内部的第一个分号,就会误判当前SQL语句已经结束,直接截断执行,必然报语法错误。
比如你给出的示例中,将终止符修改为@后,客户端会一直等到遇到@符号,才会把整段CREATE PROCEDURE代码当成完整的语句提交给数据库执行,不会被内部的分号打断。
注意:该指令属于客户端层面的配置,不属于标准SQL语法,不同数据库的同类指令写法有差异,比如MySQL中对应的是DELIMITER命令。
2. 是否需要在每个存储过程开头添加
不需要每次都加,具体规则如下:
- 同一段SQL脚本内,只需要在第一个需要使用自定义终止符的代码块之前设置一次即可,后续所有存储过程都可以沿用这个配置,直到你主动修改终止符为止
- 如果同一段脚本内写完存储过程后,需要执行普通的DML/DDL语句,可以手动将终止符改回默认的分号
;,后续如果再新增存储过程才需要重新设置 - 如果你使用的数据库管理工具已经在UI层面提供了存储过程终止符的配置选项,或者脚本内仅包含单个无内部分号的简单存储过程,也可以省略该语句
参考示例
-- 全局设置一次终止符为@,后续所有存储过程共用该配置 --#SET TERMINATOR @ CREATE PROCEDURE Proc1 LANGUAGE SQL BEGIN SELECT * FROM Table1; END @ CREATE PROCEDURE Proc2 LANGUAGE SQL BEGIN SELECT * FROM Table2; END @ -- 存储过程全部写完后,改回默认的分号终止符,执行普通SQL语句 --#SET TERMINATOR ; SELECT * FROM Table1;
内容的提问来源于stack exchange,提问作者LaidBackLuck
相关产品推荐
相关产品推荐

