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

时间:2017-03-17 06:53:48

标签: java oracle jdbc

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);
        }
    }
}

这里在我的代码中我想在数据库中插入值,但它会抛出异常,而在Statement接口中我们无法动态传递值但是我们可以手动传递值

C:\Users\MOHIT\Desktop\PACK>java Jdbc
Enter Id:-0 0
Exception is:-java.sql.SQLException: ORA-00984: column not allowed here

2 个答案:

答案 0 :(得分:3)

关于错误

从链接here

  

如果是列名,则会抛出ORA-00984(就像在VALUES中一样)   INSERT语句的子句,用于表达式中   不允许。您可能在表达式中使用了列名称   这是不允许的。通常,ORA-00984在包括a时发生   INSERT语句的VALUES子句中的列名。

     

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

     

您可能还会发现在字母中包含字符值是合适的   INSERT语句,而不是列名。

<强>解决方案

如果您仔细查看查询,那么您会发现语法不正确,这是正确的插入语法:

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 Injection您必须使用PreparedStetement

所以你可以使用:

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

答案 1 :(得分:0)

问题在于您的查询

当你对DB说:“插入st值(id)”; db不知道“id”是什么。它试图猜测它是一个列,因为它是一个没有用引号括起来的元素,这意味着它不是一个字符串值。

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

执行此操作的方法是使用YCF_L所述的预准备语句。最好始终关闭ResultSet(这里没有),语句和连接。

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();           
        }
    }
}