关于/**/注释段在SQLPlus Worksheet中的问题(转)

在Oracle9i的SQLPlusWorksheet中,作者遇到了一个奇怪的问题:DELETE和INSERT语句在特定注释下重复执行,导致唯一性约束错误。经过调查,发现/*注释*/块在某些情况下会导致命令重新执行,尤其是当注释紧随26个字母之后。
今天在Oracle 9i 的SQLPlusWorksheet中发现一个特别怪奇的问题 看如下语句 是先清除sys_object表 然后在该表中insert3条数据 在Golden32的5.7版本中执行完全正常:

/*====================*/
/*Object Data */
/*====================*/

delete from sys_object;

/*Merchant*/
--Merchant Group
insert into sys_object("OBJECT_ID","OBJECT_NAME","MENU_ID","OBJECT_TYPE","OBJECT_USER","PROCESS","CREATE_USER","CREATE_TS","ITEM_SEQ","OBJECT_SEQ")VALUES('M_MERCGR','Merchant Group','M_MERC','W','A','merchant/mercgr_browse.asp','SYSTEM',SYSDATE,3,4);

/*MPS Operation*/
insert into sys_object("OBJECT_ID","OBJECT_NAME","MENU_ID","OBJECT_TYPE","OBJECT_USER","PROCESS","CREATE_USER","CREATE_TS","ITEM_SEQ","OBJECT_SEQ")VALUES('M_OPER','MPS Operation',NULL,'M','A','','SYSTEM',SYSDATE,2,5);
--Payment Adjustment
insert into sys_object("OBJECT_ID","OBJECT_NAME","MENU_ID","OBJECT_TYPE","OBJECT_USER","PROCESS","CREATE_USER","CREATE_TS","ITEM_SEQ","OBJECT_SEQ")VALUES('M_PAYADJ','Payment Adjustment','M_OPER','W','A','operation/payadj_browse.asp','SYSTEM',SYSDATE,1,6);
commit;

但在Oracle 9i 的SQLPlusWorksheet中执行时 出现的提示却是这样的:

已删除3行


已删除0行


已创建 1 行

insert into sys_object("OBJECT_ID","OBJECT_NAME","MENU_ID","OBJECT_TYPE","OBJECT_USER","PROCESS","CREATE_USER","CREATE_TS","ITEM_SEQ","OBJECT_SEQ")VALUES('M_MERCGR','Merchant Group','M_MERC','W','A','merchant/mercgr_browse.asp','SYSTEM',SYSDATE,3,4)
*
ERROR 位于第 1 行:
ORA-00001: 违反唯一约束条件 (HYH.PK_SYS_OBJECT)



已创建 1 行


已创建 1 行


提交完成

我郁闷 语句好好的为什么会出错 看出错信息是表示在PK字段insert了重复的值 想了半天 顿悟!WorkSheet分明是在蒙我 数据我都delete了 而且俺的PK字段是OBJECT_ID字段 不可能有重复的 再仔细看一下返回信息 发现问题了 我明明只写了一条delete语句 却返回的两条delete信息 难道是delete执行了两次?假如是执行了两次 那么第二次执行的时候已经没数据了 所以delete了0 为什么执行了两次呢?

再看代码发现一个问题:
delete之后是注释块:/*Merchant*/
再看报PK错误的那一行:
之后也是注释块:/*MPS Operation*/
难道是/**/搞的鬼?
试一下 把两个注释块都改为--开头 再Run……
正常了…… 真是气死我了 果真是/**/的问题 那为什么为这个注释块没问题:
/*====================*/
/*Object Data */
/*====================*/
注:该块之前还是有其它语句的

多次测试发现 /*后面直接跟26个英文字母的注释块会导致WorkSheet把该注释块前的语句重新执行一次!
/*大小写字母*/

其实好像是:这样的注释/*大小写字母*/使SQLPlus Worksheet重新执行了缓冲区中的命令行!

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

转载于:http://blog.itpub.net/10294527/viewspace-122245/

<think>好的,我现在要解决用户的问题:使用SQL*Plus的`sqlplus /nolog`命令后没有返回任何结果。首先,我需要分析可能的原因。用户可能对这种情况感到困惑,因为通常执行命令后应该会有反馈,比如版本信息或者提示符的变化。 首先,我应该考虑基本的情况,比如SQL*Plus是否正确安装。如果用户的环境变量没有配置好,或者Oracle客户端没有安装,那么输入`sqlplus`可能会提示命令不存在。但用户已经执行了`sqlplus /nolog`,所以可能命令存在,但没有任何输出,这可能是因为路径问题或者安装不完整。 接下来,权限问题也是一个可能性。特别是在Windows系统中,如果没有以管理员权限运行命令行工具,某些操作可能会受限,但这里只是连接到nolog状态,可能不需要管理员权限,不过还是需要考虑。 另外,Oracle的版本兼容性也可能有影响。比如,某些旧版本的SQL*Plus在较新的Windows系统上可能会有兼容性问题,导致无响应。或者,用户可能安装的是64位的Oracle,但使用了32位的命令行工具,导致冲突。 还有可能是命令行工具本身的问题。比如,命令提示符的编码或设置有问题,导致输出被隐藏或者无法显示。这种情况下,可能需要检查命令提示符的属性设置,确保编码正确,比如UTF-8或者与系统区域设置一致。 另外,用户可能误以为没有输出就是有问题,但实际上,`sqlplus /nolog`成功执行后会进入SQL提示符(SQL>),但有时候可能因为命令行工具的问题,提示符没有正确显示,或者用户没有注意到光标的变化。这时候,用户可能需要检查是否真的没有反应,还是可以继续输入命令。 还有可能是防病毒软件或防火墙阻止了SQL*Plus的正常运行,导致进程被挂起,没有输出。这时候,需要检查安全软件的日志,看是否有拦截记录。 接下来,我应该思考如何逐步引导用户排查问题。首先确认`sqlplus`命令是否可用,可能用户的环境变量没有正确设置,导致系统找不到该命令。如果用户直接进入Oracle的安装目录下的bin文件夹执行,可能可以解决问题。 然后,检查权限问题,建议用户以管理员身份运行命令提示符,虽然`nolog`不需要高权限,但排除权限问题总是好的。 如果用户执行后没有看到任何输出,可能程序在后台运行但没有显示界面,或者被其他进程阻塞。这时候,检查任务管理器是否有`sqlplus.exe`进程存在,如果有的话,可能需要结束进程后重新尝试。 另外,尝试其他命令,比如`sqlplus -version`来查看是否能输出版本信息,从而确认SQL*Plus是否正常安装。 还有可能是Oracle客户端或数据库软件安装不完整或损坏,导致SQL*Plus无法正常运行。这时候,重新安装Oracle客户端可能是一个解决办法。 最后,如果所有方法都无效,可能需要查看日志文件,比如Oracle的安装日志或系统事件查看器中的错误信息,来进一步诊断问题。 总结下来,我需要将这些可能性分步骤列出,帮助用户逐一排查,确保他们能够找到问题的根源并解决。</think>### 问题分析 当执行 `sqlplus /nolog` 命令后无任何输出,可能是以下原因导致的: 1. **SQL*Plus 未正确安装或环境变量未配置** 2. **权限问题**(需管理员权限运行命令行工具) 3. **Oracle 客户端/数据库安装不完整** 4. **路径或版本兼容性问题**(如 32位/64位冲突) --- ### 分步解决方案 #### 步骤 1:验证 SQL*Plus 是否可用 1. **直接进入 Oracle 安装目录运行**: - 打开命令行工具,手动跳到 Oracle 的 `bin` 目录(示例路径): ```cmd cd C:\app\oracle\product\19.0.0\dbhome_1\bin sqlplus /nolog ``` - 若成功,会显示 `SQL>` 提示符(可能无其他输出,此为正常现象)。 2. **检查版本信息**: ```cmd sqlplus -version ``` - 若提示“不是内部命令”,说明环境变量未配置或 SQL*Plus 未安装。 --- #### 步骤 2:配置环境变量 1. **手动添加 SQL*Plus 路径到系统环境变量**: - 右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 编辑 `Path` → 添加 Oracle `bin` 目录路径(如 `C:\app\oracle\product\19.0.0\dbhome_1\bin`)。 - 重启命令行工具后重试。 2. **验证环境变量是否生效**: ```cmd echo %ORACLE_HOME% # 应返回 Oracle 安装主目录(如 C:\app\oracle\product\19.0.0\dbhome_1) ``` --- #### 步骤 3:以管理员权限运行命令行工具 1. 右键点击“命令提示符”或“PowerShell” → 选择 **以管理员身份运行**。 2. 执行以下命令: ```cmd sqlplus /nolog ``` - 若仍然无响应,可能是权限或安装问题。 --- #### 步骤 4:检查 Oracle 安装完整性 1. **重新安装 Oracle Instant Client**(轻量级客户端): - 从 [Oracle官网](https://www.oracle.com/database/technologies/instant-client.html) 下载对应版本(需与数据库版本匹配)。 - 安装后配置环境变量指向 Instant Client 的 `bin` 目录。 2. **修复 Oracle 数据库安装**: - 运行 Oracle 安装程序 → 选择“修复”选项。 --- #### 步骤 5:排查兼容性问题 1. **检查系统位数是否匹配**: - 若操作系统为 64位,确保安装的 Oracle 客户端/数据库也是 64位版本。 2. **尝试兼容模式运行**: - 右键点击 `sqlplus.exe` → 属性 → 兼容性 → 勾选“以兼容模式运行此程序”(如 Windows 7)。 --- #### 步骤 6:检查进程和日志 1. **查看 SQL*Plus 进程是否挂起**: - 打开任务管理器 → 查找 `sqlplus.exe` → 若存在,结束进程后重试。 2. **检查 Oracle 日志**: - 日志路径:`%ORACLE_HOME%\cfgtoollogs\sqlplus\` 或 `%ORACLE_HOME%\rdbms\log\`。 --- ### 常见问题示例 1. **无环境变量配置**: ```cmd C:\> sqlplus /nolog 'sqlplus' 不是内部或外部命令... ``` **解决**:按步骤 2 配置环境变量。 2. **静默返回 SQL 提示符**: ```cmd C:\> sqlplus /nolog SQL> # 光标停留在此处(无其他输出,实际已成功进入 SQL*Plus) ``` **说明**:输入 `conn / as sysdba` 可继续操作数据库。 --- ### 总结流程图 $$ \begin{aligned} &\text{执行 `sqlplus /nolog` 无响应} \\ &\downarrow \quad \text{检查环境变量和安装路径} \quad \rightarrow \text{未配置?添加路径} \\ &\downarrow \quad \text{以管理员身份运行} \quad \rightarrow \text{仍无响应?检查安装完整性} \\ &\downarrow \quad \text{验证进程和日志} \quad \rightarrow \text{修复或重新安装} \\ &\rightarrow \text{成功进入 SQL> 提示符} \end{aligned} $$ --- ### 扩展提示 - **静默模式特性**:`/nolog` 参数会跳过版本信息和登录提示,直接进入 SQL*Plus 交互界面,因此可能看似“无输出”。 - **快速测试连接**:进入 `SQL>` 后尝试连接数据库: ```sql SQL> conn username/password@hostname:port/servicename ``` 若问题仍未解决,请提供以下信息: 1. 操作系统版本(如 Windows 10 64位) 2. Oracle 客户端/数据库版本(如 19c) 3. 错误日志内容(如有)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值