gpt4 book ai didi

java - 换行符\n 给出 "java.sql.SQLException: ORA-00911: invalid character\n"Oracle 11g

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:05 25 4
gpt4 key购买 nike

我有 Oracle DB 11g 企业版,我想通过从文件中读取 sql 脚本来创建表。通过 java 代码,我从文件中读取以下 sql 脚本并将其存储在 String sqlBlock:

CREATE SEQUENCE VerHist_SeqNum
START WITH 1
INCREMENT BY 1;
CREATE TABLE VerHist
(
SequenceNumber NUMBER(10,0) NOT NULL,
SQLFileName VARCHAR2(100) NOT NULL,
STATUS VARCHAR2(10) NOT NULL,
AppliedDate DATE NOT NULL,
DateCreated DATE
DEFAULT (SYSDATE),
DateUpdated DATE
DEFAULT (SYSDATE),
CONSTRAINT PK_VerHist PRIMARY KEY( SequenceNumber ),
CONSTRAINT UC_VerHist_SQLFileNa UNIQUE( SQLFileName )
);
CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
BEFORE INSERT
ON VerHist
FOR EACH ROW
BEGIN
SELECT VerHist_SeqNum.NEXTVAL INTO :NEW.SequenceNumber
FROM DUAL;
END;

当我执行这个查询时,它给出了

java.sql.SQLException: ORA-00911: invalid character\n at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743) at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207) at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:946) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168) at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687) at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1653)

以下是我执行sql block 的代码:

Statement stmt = conn.createStatement();
String sqlBlock = //"this contains the content of the file (it contains \n charters)";
stmt.execute(sqlBlock);

换行章程在这里是否无效,如果是,如何使它正常工作?

请注意,当我复制粘贴此文件的内容并通过 Oracle SQL Developer 运行脚本时,它运行良好。

最佳答案

我认为 \n 引用是一个转移注意力的问题,并且是错误记录方式的假象。您正在尝试在一次 execute 中运行两个 SQL 语句,用分号分隔。那是不允许的。分号是 SQL*Plus 中的语句分隔符,而不是 SQL 中的分号,即使是单个语句也会生成 ORA-00911。 execute 必须是单个语句。

如果您正在执行 DML,您可以将语句包装在一个 PL/SQL block 中并执行它,但由于这是 DDL,您不能这样做,除非您求助于动态 SQL,这将变得过于复杂和困惑对于你正在尝试做的事情。

您需要将每个语句放在一个单独的文件中(在 create sequence 上没有尾随分号;您仍然需要在 create trigger 上使用它,因为它在那里正在结束触发器的 PL/SQL block ,而不是充当语句分隔符——令人困惑,我知道),并分别读取和执行它们。然后每个execute都有一个语句,会更快乐。


顺便说一句,您不需要在 11g 中选择您的序列值到您的变量中; you can now do it like this :

CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
BEFORE INSERT
ON VerHist
FOR EACH ROW
BEGIN
:NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL;
END;

关于java - 换行符\n 给出 "java.sql.SQLException: ORA-00911: invalid character\n"Oracle 11g,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20607524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com