生产环境oracle执行问题

今天生产环境有一个变更,用户反映SQL脚本根本没有执行,但是平台提示都执行成功了。查看了SQL脚本,脚本是表增加字段的脚本:

alter table XXX add (XXX  number(10)); --增加xxx字段xxx,类型为number类型

从自动化执行的结果查看,脚本确实是执行了,没有任何错误,平台报成功结果,实际变更的数据库字段根本没有增加成功。拿到脚本,放到plSQL中执行,执行成功,字段增加成功。在Linux环境下,用sqlplus执行,执行成功,字段增加失败。查了一下,原来是脚本注释问题,注释和SQL语句在以后,导致整行不执行,去掉注释就OK了。

以下是转载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;

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

/* Commission Report
 to be run monthly. */
COLUMN LAST_NAME HEADING 'LAST_NAME';
COLUMN SALARY HEADING 'MONTHLY SALARY' FORMAT $99,999;

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

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

 

关于注释的注意事项:
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  */
 
可以使用SET DEFINE OFF阻止使用替换变量。

 

转载于:https://www.cnblogs.com/li1129499045/p/5079969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值