sqlplus 下注释导致语句重复执行

字数673 大约花费3分钟

目录

  1. 1. C 风格多行注释 /**/
  2. 2. 结论

在 sqlplus 下,一些平时经常用到的 sql 注释可能导致语句重复执行,从而引发错误。

sql 的标准单行注释是两个英文减号 – 后面加上注释的内容,貌似 sql 没有标准多行注释。多行注释中,用得比较多的是 C 风格的注释

/这些是注释/

此外,也会用到以下 C 风格的单行注释

// 这些是注释

但是,sqlplus 在遇到这些注释语句时,有时会将其识别为单独的斜杠 /,而重复执行最后一次执行的语句。

通过研究,发现可能是转义的问题,现象有趣或者说复杂。

下面通过例子阐述一下哪些情况可能出现重复执行语句的问题。

首先,创建一张表,并插入和查询数据。

SQL> create table blog(

2 name char(8)

3 );

表已创建。

SQL> insert into blog values(‘tantanit’);

已创建 1 行。

SQL> select name from blog;

NAME

——–

tantanit

接下来,让我们来测试一下哪些注释会重复执行查询语句。

首先,是 C 风格单行注释 //

SQL> //comment

NAME

——–

tantanit

可以看到,重复执行了查询语句!!

SQL> //

NAME

——–

tantanit

SQL> /

NAME

——–

tantanit

而且,单独的双斜杠和单斜杠也是一样,重复执行了查询语句。

C 风格多行注释 /**/

那么,多行注释 /**/ 的情况呢?

SQL> /comment/

NAME

——–

tantanit

但是,在 * 后面如果有空格,则不会重复执行查询语句

SQL> / comment/

SQL>

此外,如果 后面的内容是,也不会重复执行查询语句

SQL> /*comment/

SQL>

另外,如果 * 后面的内容是数字或特殊字符,似乎也都不会重复执行查询语句:

SQL> /!/

SQL> /(/

SQL> /8/

SQL>

貌似,只有 * 后面是字母才会重复执行查询语句。

分成多行的注释也没有问题:

SQL> /*

SQL> commnet

SQL> */

SQL> select count(*) from blog;

COUNT(*)

———-

1

SQL> /*

SQL> *comment

SQL> */

SQL> select count(name) from blog;

COUNT(NAME)

———–

1

结论

无论如何,在 sqlplus 下执行的 sql 语句中带 C 风格的注释(// 和 /**/)都是不安全的,特别是在执行一些删除和插入操作的时候,并且由此引起的问题往往比较隐蔽,很难考虑到居然会是注释引起的问题。所以,建议对单条语句的注释使用两个英文减号 – 进行注释,针对整段的注释建议使用多个英文减号进行注释,抽象程度越高,个数越多。

 

 

谈谈 IT的文章均为原创或翻译(翻译会注明外文来源),转载请以链接形式标明本文地址: http://tantanit.com/sqlplus-xia-zhu-shi-dao-zhi-yu-ju-chong-fu-zhi-xing/

谈谈IT

欢迎关注官方微信公众号获取最新原创文章