sqlplus注释问题

问题:
投产脚本中如下sql没有执行:
update test set x=2;  --abc
经分析为注释导致的问题。

测试验证如下:
1,使用sqlplus执行
[bnet@SHPAM013:/bnet]$ sqlplus bnet303/bnet303@orau10g

SQL*Plus: Release 10.2.0.5.0 - Production on Sat Sep 20 10:33:18 2014

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> drop table test;
create table test(x int);

Table dropped.

SQL>

Table created.

SQL> SQL> insert into test values(1);

1 row created.

SQL>
SQL> commit;

Commit complete.

SQL>
SQL> update test set x=2;

1 row updated.

SQL>
SQL> select * from test;

         X
----------
         2

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL> update test set x=2;  --abc
  2 
SQL> select * from test;

         X
----------
         1
==>update没有执行

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL> update test set x=2;  /*abc*/
  2 
SQL> select * from test;

         X
----------
         1
==>update没有执行

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL>
SQL>
SQL> update test set x=2;  /* abc*/
  2 
SQL> select * from test;

         X
----------
         1
==>update没有执行

SQL>
SQL> rollback;

Rollback complete.

SQL>
SQL>
SQL> select * from test; --abc
  2 
SQL>
SQL> select * from test; /* abc */
  2 
SQL>


2,使用pl/sql Developer command窗口执行

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.5.0
Connected as bnet303@oversea_SIT_22.188.20.138
 
SQL>
SQL> drop table test;
 
Table dropped
SQL> create table test(x int);
 
Table created
SQL> insert into test values(1);
 
1 row inserted
SQL> commit;
 
Commit complete
SQL> update test set x=2;
 
1 row updated
SQL> select * from test;
 
                                      X
---------------------------------------
                                      2
SQL> rollback;
 
Rollback complete
SQL> update test set x=2;  --abc
 
1 row updated
SQL> select * from test;
 
                                      X
---------------------------------------
                                      2
==>update执行了,此处有差异

SQL> rollback;
 
Rollback complete
SQL> update test set x=2;  /*abc*/
SQL> select * from test;
 
                                      X
---------------------------------------
                                      1
==>update没有执行

SQL> rollback;
 
Rollback complete
SQL> update test set x=2;  /* abc*/
SQL> select * from test;
 
                                      X
---------------------------------------
                                      1
==>update没有执行

SQL> rollback;
 
Rollback complete
SQL> select * from test; --abc
 
                                      X
---------------------------------------
                                      1
SQL> select * from test; /* abc */
 
  2 
SQL>
SQL>

 

附录,SQL*Plus脚本中注释方法
<>
5 Using Scripts in SQL*Plus

在SQL*Plus脚本中注释方法有三种:
* 使用REMARK命令注释单行
* 使用SQL注释分割符/*... */注释单行或多行
* 使用ANSI/ISO注释方式--注释单行

(1)使用REMARK命令
REMARK命令单独占一行,不要在一个sql语句中间使用该命令。

如:
REMARK Commission Report;
REMARK to be run monthly.;
COLUMN LAST_NAME HEADING 'LAST_NAME';
COLUMN SALARY HEADING 'MONTHLY SALARY' FORMAT $99,999;
COLUMN COMMISSION_PCT HEADING 'COMMISSION %' FORMAT 90.90;
REMARK Includes only salesmen;
SELECT LAST_NAME, SALARY, COMMISSION_PCT
FROM EMP_DETAILS_VIEW
WHERE JOB_ID='SA_MAN';

(2) 使用 /*...*/
可以在脚本中同一行、不同行使用/*...*/,也可以在PL/SQL块中使用。必须在/*后面的注释内容前增加一个空格。
该注释可以跨越多行,但不能嵌套。

如:
/* Commission Report
 to be run monthly. */
COLUMN LAST_NAME HEADING 'LAST_NAME';
COLUMN SALARY HEADING 'MONTHLY SALARY' FORMAT $99,999;
COLUMN COMMISSION_PCT HEADING 'COMMISSION %' FORMAT 90.90;
REMARK Includes only salesmen;
SELECT LAST_NAME, SALARY, COMMISSION_PCT
FROM EMP_DETAILS_VIEW
/* Include only salesmen.*/
WHERE JOB_ID='SA_MAN';

(3) 使用--
可以在SQL、PL/SQL块、SQL*Plus命令中使用--注释。由于没有结束符,该注释不能跨多行。
对于PL/SQL和SQL,在命令行后使用该注释或单独占用一行。

如:
-- Commissions report to be run monthly
DECLARE --block for reporting monthly sales


对于SQL*Plus命令,只能在独占行中使用该类型注释。如,下面的注释合法:

-- set maximum width for LONG to 777
SET LONG 777

下面的注释非法:
SET LONG 777 -- set maximum width for LONG to 777

下面的注释使该命令不执行
-- SET LONG 777


关于注释的注意事项:
SQL*Plus本身并不解析SQL或PL/SQL,它只是扫描每个语句的前几个关键词以确定命令类型、SQL、PL/SQL或SQL*Plus。
如果注释位置不当,将导致SQL*Plus无法识别命令类型,导致错误。注意如下问题:
(a) 不要在语句的前几个关键词中添加注释,比如:

CREATE OR REPLACE
  2  /* HELLO */
  3  PROCEDURE HELLO AS
  4  BEGIN
  5  DBMS_OUTPUT.PUT_LINE('HELLO');
  6  END;
  7  /

Warning: Procedure created with compilation errors.

这种注释导致SQL*Plus无法识别命令类型. SQL*Plus在遇到“/”时会将改PL/SQL块提交到服务器.

调整注释位置可以避免此错误如:

CREATE OR REPLACE PROCEDURE
  2  /* HELLO */
  3  HELLO AS
  4  BEGIN
  5  DBMS_OUTPUT.PUT_LINE('HELLO');
  6  END;
  7  /

Procedure created.

(b) 不要再语句结束符(句号,分号,/)后增加注释(period, semicolon or slash).
如:
SELECT 'Y' FROM DUAL; -- TESTING

将会报如下错误:
SELECT 'Y' FROM DUAL; -- TESTING
                    *
ERROR at line 1:
ORA-00911: invalid character
 
SQL*Plus无法解析语句结束符后面的内容,也就无法执行该命令了。

 

(c)不要在注释行后面增加语句结束符。如:

SELECT *
-- COMMENT;

将会报如下错误:
-- COMMENT
         *
ERROR at line 2:
ORA-00923: FROM keyword not found where expected
 
注释后面的分号被解析为语句结束符,SQL*Plus将不完整的SQL发送到服务器,导致出错。

(d)不要在注释行内使用'&'符号。如:

SELECT REGION_NAME, CITY
/* THIS & THAT */
FROM EMP_DETAILS_VIEW
WHERE SALARY>12000;

SQL*Plus将"&"解析为替换变量:

Enter value for that:
old   2: /* THIS & THAT */
new   2: /* THIS  */

REGION_NAME               CITY
------------------------- ------------------------------
Americas                  Seattle
Americas                  Seattle
Americas                  Seattle
Europe                    Oxford
Europe                    Oxford
Americas                  Toronto
6 rows selected.
 
可以使用SET DEFINE OFF阻止使用替换变量。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18922393/viewspace-753097/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/18922393/viewspace-753097/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值