【问题标题】:Why do C-style comments make insert statement run twice?为什么 C 风格的注释会使插入语句运行两次?
【发布时间】:2015-01-22 12:13:30
【问题描述】:

长话短说,我开始遇到 ORA-00001 主键违规问题,我追查到问题是因为我的一些 INSERT INTO 语句运行了两次。然后我发现有问题的命令之后有一个 C 风格的注释:

WHENEVER SQLERROR EXIT FAILURE

SET ECHO OFF
SET HEADING OFF
SET PAGESIZE 0
SET FEEDBACK OFF
SET TIMING OFF
SET TIME OFF
SET TRIMSPOOL ON
SET TRIMOUT ON
SET LINESIZE 120

SET SQLBLANKLINES ON
SET SERVEROUTPUT ON

[...]

INSERT INTO INF_FIELD (FIELD_ID, CATEGORY_ID, COLUMN_EXPRESSION, DISPLAY_NAME, SORT_ORDER) VALUES (17, 1, 'FOO.NAME', 'Name of the foo', 17);

/*This is a comment*/

然后通过切换到以下语法很容易解决:

--This is a comment

/*...*/ cmets 让 SQL*Plus 运行该语句两次的确切原因是什么?

【问题讨论】:

  • 因为/在SQL*PLus中执行命令?

标签: oracle oracle10g sqlplus oracle-xe


【解决方案1】:
/* This is a comment */

只要确保/* 后面有一个空格,
因此它被视为单行/多行注释。并不意味着执行最后存储的 PL/SQL 或 SQL

说的详细一点。

SQL*Plus 在/ 之后解释的内容被忽略,它盲目地将其缓存块推送到服务器中。除了/* 后跟new linespace

SQL> SELECT * FROM DUAL;

D
-
X

SQL> /*t*/

D
-
X

SQL> /*
SQL> */
SQL> /

D
-
X

SQL> /*s

D
-
X

From Document:

您必须在斜线星号 (/*) 开始后输入一个空格 评论。

【讨论】:

  • 感谢您的链接,但该文档没有解释它与什么混淆(或为什么)。正如保罗在评论中指出的那样,它可能正在运行slash operator
  • @ÁlvaroG.Vicario 是的,我想到了这个评论,并把答案写成了它的扩展!
猜你喜欢
  • 2015-01-21
  • 2015-05-20
  • 2017-12-28
  • 1970-01-01
  • 2012-01-11
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多