JDBC - ORA-00984:此处不允许列


import java.util.*;
import java.sql.*;
public class Jdbc {
public static void main(String j[]) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter Id:-");
int id = sc.nextInt();
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "System", "Mohit");
String sql = "insert into st values(id)";
Statement stmt = conn.createStatement();
boolean res = stmt.execute(sql);
if (!res) {
System.out.println("Value Inserted");
} else {
System.out.println("Value  Not Inserted");
}
} catch (Exception k) {
System.out.println("Exception is:-" + k);
}
}
}

在我的代码中,我想在数据库中插入值,但它会给我抛出异常,而在语句接口中,我们不能动态传递值,但我们可以手动传递值

C:UsersMOHITDesktopPACK>java Jdbc
Enter Id:-0 0
Exception is:-java.sql.SQLException: ORA-00984: column not allowed here

关于错误

从这里的链接

如果列名(如在 VALUES 中 INSERT 语句的子句),用于表达式中,其中 不允许。 您可能在表达式中使用了列名,其中 这是不允许的。 通常,ORA-00984 在包含 插入语句的 VALUES 子句中的列名。

要更正 ORA-00984,您只需要查看 SQL 的语法 语句,并且仅在适当的位置使用列名。

您可能还会发现在 插入语句,而不是列名。


解决 方案

如果你仔细观察你的查询,你会发现语法不正确,这是正确的插入语法:

INSERT INTO table_name (column1, column2) VALUES (value1, value2);

如果要传递所有列,则无需指定列名称。

INSERT INTO table_name VALUES (value1, value2);

如果您的表仅包含 id,则可以使用 :

String sql = "insert into st values(" + id + ")";
//---concat your id with your query-^--^-^----

如果您的表包含多列,则可以使用:

String sql = "insert into st(id) values(" + id + ")";
//---------------------------^^-------------^^-------

注意

语句可能会导致语法错误或您必须使用的 SQL 注入 准备Stetement

因此,您可以使用:

String sql="insert into st values(?)";
PreparedStatement insert = connection.prepareStatement(sql);
insert.setInt(1, id);
boolean res = insert.execute(sql);
...

问题出在您的查询上

当您对数据库说:"插入 st 值(id)"时; 数据库不知道"ID"是什么。它试图猜测它是一个列,因为它是一个没有括在引号中的元素,这意味着它不是一个字符串值。

但是当时没有这样的列可用,这是由引发的异常指示的。

一种方法是按照YCF_L所述使用准备好的声明。此外,最好始终关闭结果集(此处没有)、语句和连接。

import java.util.*;
import java.sql.*;
public class Jdbc {
public static void main(String j[]) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter Id:-");
int id = sc.nextInt();
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "System", "Mohit");
String sql="insert into st values(?)";
PreparedStatement psmt = connection.prepareStatement(sql);
psmt.setInt(1, id);
boolean res = psmt.executeUpdate();
if (!res) {
System.out.println("Value Inserted");
} else {
System.out.println("Value  Not Inserted");
}
} catch (Exception k) {
System.out.println("Exception is:-" + k);
}
finally {
psmt.close();
conn.close();           
}
}
}

最新更新