换行章程\n给出"java.sql.SQLException:ORA-00911:无效字符\n"Oracle 11g

 教坏的黑天使_203 发布于 2023-02-10 11:14

我有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: 在Oracle的oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)处的无效字符\n .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 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块的代码:

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

这里的换行章程是否无效,如果是的话,如何让这个工作起作用呢?

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

1 个回答
  • 我认为\n引用是一个红鲱鱼,以及如何记录错误的人工制品.您尝试在一个中运行两个由分号分隔的SQL语句execute.这是不允许的.分号是SQL*Plus中的语句分隔符,而不是SQL,并且即使使用单个语句也会生成ORA-00911.并且execute必须是一个单一的声明.

    如果您正在使用DML,您可以将语句包装在PL/SQL块中并执行它,但由于这是DDL,因此除非您使用动态SQL,否则无法执行此操作,这对于您来说过于复杂和混乱正在努力做.

    你需要将每个语句放在一个单独的文件中(没有上面的尾部分号create sequence;你仍然需要它,create trigger因为它结束了触发器的PL/SQL块,而不是作为语句分隔符 - 令人困惑,我知道) ,并分别阅读和执行它们.然后每个人execute都有一个声明,并会更快乐.


    另外,您不需要在11g的变量中选择序列值; 你现在可以这样做:

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

    2023-02-10 11:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有