sqlplus下注释导致语句重复执行
2013-08-13 17:58
218 查看
原文地址:http://tantanit.com/sqlplus-xia-zhu-shi-dao-zhi-yu-ju-chong-fu-zhi-xing/
在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
而且,单独的双斜杠和单斜杠也是一样,重复执行了查询语句。
那么,多行注释/**/的情况呢?
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风格的注释(//和/**/)都是不安全的,特别是在执行一些删除和插入操作的时候,并且由此引起的问题往往比较隐蔽,很难考虑到居然会是注释引起的问题。所以,建议对单条语句的注释使用两个英文减号–进行注释,针对整段的注释建议使用多个英文减号进行注释,抽象程度越高,个数越多。
在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风格的注释(//和/**/)都是不安全的,特别是在执行一些删除和插入操作的时候,并且由此引起的问题往往比较隐蔽,很难考虑到居然会是注释引起的问题。所以,建议对单条语句的注释使用两个英文减号–进行注释,针对整段的注释建议使用多个英文减号进行注释,抽象程度越高,个数越多。
相关文章推荐
- 【转自Oracle ACE --杨廷琨】sqlplus注释导致语句重复执行
- 重复执行sql语句前的判断参考-仅供自己备忘参考
- sql语句删除由于无主键导致完全重复的数据方法
- sql可重复执行语句例子
- SQL Server 第四堂课,创建存储过程。存储过程是一组编译在单个执行计划中的transact-SQL语句。存储过程相当于C#函数,可以允许模块化程序设计,允许更快执行如果某操作需要大量transct-SQL代码或需要重复执行,将在创建存储过程中对其进行分析和优化。
- 一次数据库不繁忙时一条sql语句2个执行计划导致业务超时的故障处理
- SQL*PLUS中批量执行SQL语句
- 一条执行4秒的sql语句导致的系统问题 (转)
- 在sql*plus中显示语句执行所用的时间
- sqlplus查看sql语句执行时间
- 重复执行SQL判断语句整合
- sqlplus执行sql语句,错误
- 数据重复导致创建唯一索引失败,删除重复数据的SQL语句
- Oracle,Sql*plus执行语句;DBMS_OUTPUT输出
- mysql版本不同所导致SQL语句执行错误的问题
- sqlplus执行存储过程和sql语句
- 使用GO将SQL语句重复执行多次
- DedeCms V5.6 plus/advancedsearch.php 任意sql语句执行漏洞
- sqlplus执行有空行的SQL语句
- Dapper执行Sql语句HitCache导致很慢