问题:
投产脚本中如下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/