使用 JDBC 准备语句插入时出错

Posted

技术标签:

【中文标题】使用 JDBC 准备语句插入时出错【英文标题】:Error while inserting using JDBC prepared statement 【发布时间】:2012-04-25 09:36:51 【问题描述】:

我正在尝试使用以下 JDBC 语句将一些值从 Java 插入 Oracle DB:

String SQL_PREP_INSERT = "INSERT INTO ABC.TEST (LOG_ID, SESSION_ID,USER_ID) VALUES"
            + " (ABC.logid_seq.nextval, ?, ?)";

stmt = con.prepareStatement(SQL_PREP_INSERT);
stmt.setString(1, sessionId);
stmt.setString(2, userid);
stmt.execute();
stmt.close();

序列创建如下:

create sequence  ABC.logid_seq
minvalue 1 maxvalue 9999999999999999999999 
increment by 10 start with 10 cache 20 noorder  nocycle ;

我收到以下错误,

java.sql.SQLException: ORA-00942: table or view does not exist

但是当我尝试手动插入表格时,它是成功的。

insert into ABC.test(LOG_ID,SESSION_ID,USER_ID) values 
    (VZPPTL.logid_seq.nextval,'test_session', '001');

有什么问题?

【问题讨论】:

***.com/questions/6561650/… sorry.. 如何接受答案? 谢谢..我接受了以前的问题.. 【参考方案1】:

可能查看了错误的表或数据库。您确定您从代码中查看了正确的数据库吗?

【讨论】:

是的,它正确的数据库和正确的表,因为我之前能够在将序列添加到插入语句之前插入。我刚刚删除了表并通过添加新列 log_id 重新创建。现在出现此错误。 你试过在数据库上运行preparedstatement生成的查询吗? 没有。我现在无法生成 Prepared Statement 查询,因为代码在不同的框中,我需要删除代码更改。但是在本地机器上我不能尝试,因为有pointbase而不是Oracle DB。我在尝试使用 pointbase 时得到以下信息,java.sql.SQLException: Column "NEXTVAL" not found in table at position 211. 我现在开始工作了。问题是序列的特权问题。必须向应用程序访问的角色授予“选择”权限。谢谢。【参考方案2】:

在准备语句中不需要给出模式名称(在本例中为 ABC)。

试试这个,它可能会工作。

String SQL_PREP_INSERT = "插入测试(LOG_ID,SESSION_ID,USER_ID)值" + " (logid_seq.nextval, ?, ?)";

【讨论】:

嗯好的,我会尝试不使用模式名称。但以前我可以使用 schema.table_name 插入。但在那种情况下,我没有序列。 String SQL_PREP_INSERT = "INSERT INTO ABC.TEST (SESSION_ID,USER_ID) VALUES" + " (?, ?)"; 我刚刚添加了一个新列 log_id。并使用序列插入。添加后,它会抛出该错误。

以上是关于使用 JDBC 准备语句插入时出错的主要内容,如果未能解决你的问题,请参考以下文章

通过 jdbc 通过准备好的语句传递 SQL 命令时出错

org.hibernate.tool.schema.spi.CommandAcceptanceException:通过JDBC语句执行DDL时出错

将字符串参数插入准备好的语句的问题

JDBC 创建表并插入亚马逊红移时出错

使用 Postgresql JDBC 时,将导致插入 0 行的 INSERT 语句

在 JDBC 中为 SQL Query 插入单引号不起作用