【问题标题】:Unlikely ORA 0955 Error [duplicate]不太可能出现 ORA 0955 错误 [重复]
【发布时间】:2015-02-05 02:50:10
【问题描述】:

运行我的批处理 (.BAT) 文件(该文件运行另一个 SQL 文件)时出现此错误 ORA 0955。

批号:

@echo off
setlocal
set "SqlUserName="
set "SqlPassword="
set "SqlDatabase="
:Credentials
set /P "SqlUserName=Enter username: "
set /P "SqlPassword=Enter password: "
set /P "SqlDatabase=Enter database: "
@(
echo whenever sqlerror exit failure
echo connect %SqlUserName%/%SqlPassword%@%SqlDatabase%
echo @C:\Users\njediaz\Desktop\sql.sql
echo exit 
) | sqlplus.exe -s /nolog
if errorlevel 1 goto Credentials
echo About to exit.
timeout /t 30
endlocal

SQL.sql 代码

--conn cpi/cpi12345!@fgicrcm
--conn &&username@&&DBNAME

SET HEADING OFF;
SET ECHO OFF;
SET PAGES 999;
SET LONG 999999;
SET LONGCHUNKSIZE 999999;
SET PAGESIZE 0;
SET LINESIZE 500;

/****************/
/*BACKUP Scripts*/
/****************/

--Use SPOOL then set the filename and location of the scripts to be saved.--
--Use DBMS_METADATA.get_ddl and specifiy the OBJECT_TYPE, OBJECT_NAME and OWNER_NAME--

SPOOL C:\GeniisysUpdater\Backup\Scripts\GIAC_ORDER_OF_PAYTS_PKG.pks
SELECT DBMS_METADATA.get_ddl ('PACKAGE_SPEC', 'GIAC_ORDER_OF_PAYTS_PKG', 'CPI') FROM DUAL;
SPOOL OFF
HOST ECHO / >>  C:\GeniisysUpdater\Backup\Scripts\GIAC_ORDER_OF_PAYTS_PKG.pks

SPOOL C:\GeniisysUpdater\Backup\Scripts\GIAC_ORDER_OF_PAYTS_PKG.pkb
SELECT DBMS_METADATA.get_ddl ('PACKAGE_BODY', 'GIAC_ORDER_OF_PAYTS_PKG', 'CPI') FROM DUAL;
SPOOL OFF 
HOST ECHO / >> C:\GeniisysUpdater\Backup\Scripts\GIAC_ORDER_OF_PAYTS_PKG.pkb

/*********************/
/*INSTALL New Scripts*/
/*********************/

SPOOL C:\GeniisysUpdater\Install\Scripts\Logs\GIAC_ORDER_OF_PAYTS_PKG_pks.log
@C:\GeniisysUpdater\Install\Scripts\GIAC_ORDER_OF_PAYTS_PKG.pks
SPOOL OFF

SPOOL C:\GeniisysUpdater\Install\Scripts\Logs\GIAC_ORDER_OF_PAYTS_PKG_pkb.log
@C:\GeniisysUpdater\Install\Scripts\GIAC_ORDER_OF_PAYTS_PKG.pkb
SPOOL OFF

/***************************/
/*RECOMPILE Invalid Scripts*/
/***************************/

SPOOL C:\GeniisysUpdater\Install\Scripts\Logs\recompile_scripts.log
@C:\GeniisysUpdater\Backup\rcpl.sql
SPOOL OFF

/***************************/
/*Check if batch is done*/
/***************************/

SPOOL C:\GeniisysUpdater\Install\Files\batchDone.log
SELECT 1 FROM DUAL /
SPOOL OFF

EXIT

我尝试在 TOAD 中运行每个数据库文件(pks、pkb、sql),但没有收到任何错误。

这是我对以下脚本的代码:

GIAC_ORDER_OF_PAYTS_PKG.pks

GIAC_ORDER_OF_PAYTS_PKG.pkb

rcpl.sql

【问题讨论】:

  • 如果您要重新执行脚本,请确保在 CREATE 之前有 DROP 语句以使脚本可重新执行。另一个原因可能是语句后面有一个“/”,但是你已经用分号结束了前一个语句。从而重新执行缓冲区中的语句。
  • 我应该删除“/”吗?还是分号?
  • 坚持终结者之一。分号用于单个语句,“/”用于块。
  • 你能在错误发生之前和之后显示几行代码吗?
  • @OP,请参阅 Jon Heller 的回答。

标签: sql database oracle batch-file sqlplus


【解决方案1】:

问题在于注释前的代码间距不正确。例如,将此文本复制并粘贴到 SQL*Plus 中:

create table only_execute_once(a number);
/***************************/
/*RECOMPILE Invalid Scripts*/
/***************************/

结果如下所示:

SQL>     create table only_execute_once(a number);

Table created.

SQL>     /***************************/
SQL>     /*RECOMPILE Invalid Scripts*/
    create table only_execute_once(a number)
                 *
ERROR at line 1:
ORA-00955: name is already used by an existing object


SQL>     /***************************/
SQL>

来自SQL*Plus manual

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

虽然它已记录在案,但我仍然认为这是一个错误。大多数情况下,这些类型的 cmets 都有效。 SQL*Plus 解析器在斜杠方面存在一些问题。

【讨论】:

  • 我认为这不是问题。 SQL> SELECT 'before' FROM dual; 'BEFOR ------ before SQL> /***************************/ SQL> /*RECOMPILE Invalid Scripts*/ 'BEFOR ------ before SQL> /***************************/ SQL> SELECT 'after' FROM dual; 'AFTE ----- after SQL>
  • @LalitKumarB 我添加了一个更好的例子。
  • 完美!你搞定了。正如我认为罪魁祸首会是斜线,然而,没想到它是cmets。 +1
  • 但是正如你在我的 SQL.sql 代码中看到的那样,代码和 cmets 之间总是有一个空格/换行符。
  • @ladiesman1792 问题不在于代码和 cmets 之间的空格,而在于您的评论 inside 缺少空格。根据 SQL 和 PL/SQL 语法,您的代码是有效的,但不是 SQL*Plus 规则。
猜你喜欢
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 2014-02-17
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多