SQL*Plus和SQL开发人员
关于在sql*PLUS中执行pl/sql脚本,我有一个简单的问题:SQL*Plus和SQL开发人员,sql,oracle,plsql,sqlplus,plsqldeveloper,Sql,Oracle,Plsql,Sqlplus,Plsqldeveloper,关于在sql*PLUS中执行pl/sql脚本,我有一个简单的问题: create or replace trigger CICD.S_ACCNT_POSTN_DELETE after delete on CICD.S_ACCNT_POSTN FOR EACH ROW BEGIN INSERT INTO CICD.CX_PROCCHLDDEL (ROW_ID, OBJECT_TYPE, PARENT_ID, CHILD_ID,STATUS,CREA
create or replace trigger CICD.S_ACCNT_POSTN_DELETE
after delete on CICD.S_ACCNT_POSTN
FOR EACH ROW
BEGIN
INSERT INTO CICD.CX_PROCCHLDDEL (ROW_ID, OBJECT_TYPE, PARENT_ID,
CHILD_ID,STATUS,CREATED,CREATED_BY,LAST_UPD,LAST_UPD_BY)
VALUES (:old.ROW_ID,'AccountTeam', :old.OU_EXT_ID, :old.POSITION_ID
,'Not Synchronized', SYSDATE,:old.CREATED_BY
,SYSDATE,:old.LAST_UPD_BY);
END;
此脚本生成以下错误:
E- ORA-00900: invalid SQL statement
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
E- oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
E- oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
E- oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
E- oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
E- oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
E- oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:999)
E- oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
E- oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1890)
E- oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1855)
E- oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:304)
E- com.uc4.ara.feature.database.SQLFeature.executeSQLScript(SQLFeature.java:164)
E- com.uc4.ara.feature.database.SQLFeature.run(SQLFeature.java:53)
E- com.uc4.ara.feature.AraFileCmd.main(AraFileCmd.java:120)
E- ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
E- oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
E- oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
E- oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
E- oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
E- oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
E- oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:999)
E- oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
E- oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1890)
E- oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1855)
E- oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:304)
E- com.uc4.ara.feature.database.SQLFeature.executeSQLScript(SQLFeature.java:164)
E- com.uc4.ara.feature.database.SQLFeature.run(SQLFeature.java:53)
E- com.uc4.ara.feature.AraFileCmd.main(AraFileCmd.java:120)
我还尝试执行顶部带有DECLARE的脚本。执行此操作时,会出现以下错误:
E- ORA-00900: invalid SQL statement
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
E- oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
E- oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
E- oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
E- oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
E- oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
E- oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:999)
E- oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
E- oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1890)
E- oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1855)
E- oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:304)
E- com.uc4.ara.feature.database.SQLFeature.executeSQLScript(SQLFeature.java:164)
E- com.uc4.ara.feature.database.SQLFeature.run(SQLFeature.java:53)
E- com.uc4.ara.feature.AraFileCmd.main(AraFileCmd.java:120)
E- ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:
( begin case declare exit for goto if loop mod null pragma
raise return select update while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
continue close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe purge
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
E- oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
E- oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
E- oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
E- oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
E- oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
E- oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
E- oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:999)
E- oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1315)
E- oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1890)
E- oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1855)
E- oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:304)
E- com.uc4.ara.feature.database.SQLFeature.executeSQLScript(SQLFeature.java:164)
E- com.uc4.ara.feature.database.SQLFeature.run(SQLFeature.java:53)
E- com.uc4.ara.feature.AraFileCmd.main(AraFileCmd.java:120)
E-ORA-06550:第2行第1列:
PLS-00103:在预期以下情况时遇到符号“创建”:
(begin case如果循环mod null pragma,则为goto声明退出
使用时升高返回选择更新
“有趣的是,当我在SQL Developer中粘贴这两个脚本中的任何一个时,它会完美地执行脚本。”
您只显示了一个脚本。但是,您发布的脚本缺少尾部的/
。SQLPlus使用斜杠表示PL/SQL可执行语句的结尾。因此,假设这不仅仅是发布错误,您有两个脚本在PL/SQL语句的结尾处没有斜杠。这意味着SQLPlus引擎无法分隔m、 这可能会导致SQLPlus抛出一个ora-00900
异常
当然,如果您手动运行这些脚本,您会看到SQL Plus挂起,等待您键入终止斜杠。我猜想Java错误堆栈意味着您正在通过某种形式的构建运行程序运行脚本
像SQLDeveloper这样的IDE将运行单个脚本而不带尾随斜杠,因为它们可以处理它;通过突出显示一些代码并按[F8]他们可以找出语句并模拟尾部斜杠。SQL*Plus不会抛出Java错误堆栈。因此,您必须使用其他工具。您是否使用构建工具(Ant?Maven?Hand rolled Groovy?)运行脚本?我认为这是来自上一条语句,该语句本身没有以/
结尾。请参见第2行
:您的CREATE关键字位于第1行。如果我使用BEGIN on on top,我将收到第二条错误消息,如果我使用DECLARE(这对我来说非常符合逻辑)在顶部,而不是开始,我只是得到一个E-ORA-00900:无效的SQL语句。而且,如果我什么也没有放在那里,我得到的是无效的SQL语句。是的,我正在运行一个自动化工具来执行这个命令。感谢你们的回复。非常感谢。也感谢你们的回复,我确实在最后放了一个斜杠,还试着放了一个b在开始之前(脚本的第二部分),这些都不起作用。我需要以某种方式重构代码,使之对SQL*Plus有效。。。。。