java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在

新手上路,请多包涵

当我尝试使用以下代码从 Oracle 数据库读取数据时出现异常

ResultSet res=stmt.executeQuery("select * from food");

但是当我在命令提示符下直接使用这个命令时,这个表实际上存在于我的数据库中,它工作正常。而且对于数据库中表中的一个表,这个代码工作正常,但对于其他表名,它不能正常工作。所以有人请解释为什么会这样。

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

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
    at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:852)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1477)
    at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:392)
    at connecttooracle.ConnectOracle.main(ConnectOracle.java:67)

我正在通过 Toad 访问食物表中的数据。那么为什么我会在 java 中收到此错误?

我的完整代码是:

 public class ConnectOracle {

 public static void main(String[] args) {

  String driver = "oracle.jdbc.driver.OracleDriver"; //

  String serverName = "10.11.201.84";
  String portNumber = "1521";
  String db = "XE";
  String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":"
    + db; // connectOracle is the data
  // source name
  String user = "ORAP"; // username of oracle database
  String pwd = "ORAP"; // password of oracle database
  Connection con = null;
  ServerSocket serverSocket = null;
  Socket socket = null;
  DataInputStream dataInputStream = null;
  DataOutputStream dataOutputStream = null;

  try {
   Class.forName(driver);// for loading the jdbc driver

   System.out.println("JDBC Driver loaded");

   con = DriverManager.getConnection(url, user, pwd);// for
                // establishing
   // connection
   // with database
   Statement stmt = (Statement) con.createStatement();

   serverSocket = new ServerSocket(8888);
   System.out.println("Listening :8888");

   while (true) {
    try {

     socket = serverSocket.accept();
     System.out.println("Connection Created");
     dataInputStream = new DataInputStream(
       socket.getInputStream());
     dataOutputStream = new DataOutputStream(
       socket.getOutputStream());
     System.out.println("ip: " + socket.getInetAddress());
     // System.out.println("message: " +
     // dataInputStream.readUTF());

     ResultSet res=stmt.executeQuery("select * from food");
     while(res.next()){
      System.out.println(res.getString(1));
     }

    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }

    if (dataInputStream != null) {
     try {
      dataInputStream.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }

    if (dataOutputStream != null) {
     try {
      dataOutputStream.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

原文由 osimer pothe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

如果您的表位于架构 A 下:

 select * from A.food

编辑

如果您可以使用用户 ORAP 通过 TOAD 登录并执行相同的查询(select * from food),那么您肯定拥有 ORAP 模式中的表。我认为“select * from ORAP.food”没有理由失败。

原文由 Y.E. 发布,翻译遵循 CC BY-SA 3.0 许可协议

一些可能的解决方案是:

您可以通过数据库所在的模式在数据库中创建连接。

例如: 我原来的数据库有 admin SYSTEM 然后我创建了一个用户 Toad 并且在这个 Toad 模式下我创建了表 Food

所以我将通过以下方式创建与数据库的连接:

 Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "Toad", "PasswordOfToad");

然后查询 ResultSet res = stmt.executeQuery("select * from Food"); 将正常工作。

或者,您可以通过 SchemaName.DatabaseName 指定表,在本例中分别是 ToadFood

所以查询看起来像:

 ResultSet res = stmt.executeQuery("select * from Toad.Food");

原文由 Pran Kumar Sarkar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题