【问题标题】:java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not existjava.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在
【发布时间】:2016-08-23 00:40:18
【问题描述】:

当我尝试使用以下代码从 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();
  }
 }
}

【问题讨论】:

  • 如果您的数据库中存在表,请检查您的应用程序中的数据库连接
  • 尝试在你的表food之前添加你的数据库架构。
  • 如何添加数据库架构?
  • 你检查过你的数据库连接信息吗?!也许你有错误的信息要连接,或者你有多个连接,例如一个到 oracle 的连接和另一个到 mysql 的连接!
  • 如何检查?

标签: java oracle


【解决方案1】:

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

select * from A.food

编辑

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

【讨论】:

  • 我试过了。 ResultSet res=stmt.executeQuery("select * from XE.food");但我得到了同样的错误。
  • XE 是您的数据库名称。使用“ORAP.food”
  • 有什么问题?
  • 您的表可能位于不同的架构下。您说您可以使用 TOAD 登录,因此登录并查看表的架构,然后相应地更改查询。或者在 TOAD 上尝试此查询以查看架构名称(如果您有特权): select owner from all_tables where table_name='food'
  • 我试过这个查询。从 all_tables 中选择所有者,其中 table_name='food' 。但没有得到任何东西。
【解决方案2】:

一些可能的解决方案是:

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

例如: 我原来的数据库有 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");

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,这样的事情对我有用:

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

    【讨论】:

      【解决方案4】:

      我遇到了这个错误,解决办法是执行:

      grant all on <schema>.<table> to <user>;
      grant all on <schema>.<sequence> to <user>;
      

      【讨论】:

        【解决方案5】:

        阅读this。有各种原因和解决方案。

        【讨论】:

          【解决方案6】:

          由于这个原因,你发现了这个异常。 您尝试执行的 SQL 语句引用的表或视图不存在、您无权访问或属于另一个架构并且您没有通过架构名称引用该表。

          【讨论】:

          • 我已经检查了所有这些但没有任何反应。
          • 能否请您详细说明您的问题,以便我给出解决方案。
          • 在查询中使用你的 scemaName.tableName
          【解决方案7】:

          按照这些步骤进行

          • 首次使用相同的用户名和密码登录 TOAD。如果它给出错误,那么您的凭据是错误的
          • 如果您能够成功登录,请尝试以下查询:SELECT table_name, owner, tablespace_name FROM all_tables;
          • 您可以使用上述查询查看您的表名是否存在

          【讨论】:

            【解决方案8】:

            我也遇到了同样的问题, 分辨率为:

            1. 打开 hibernate.cfg.xml 文件
            2. 使用添加您的 POJO 类

            同时检查, 真的 更新

            【讨论】:

              【解决方案9】:

              这样就可以解决问题了:

              打开hibernate.cfg.xml文件

              正确检查映射

              &lt;mapping class="com.xyz.abc.java"/&gt;

              还要确保以下行:

              &lt;property name="hibernate.hbm2ddl.auto"&gt;update&lt;/property&gt;

              【讨论】:

                【解决方案10】:

                就我而言,我解决了执行问题:

                grant all on <schema>.<table> to <user>;
                

                【讨论】:

                  【解决方案11】:

                  你应该提到 Schema.table 例如 Schema name=xyz 然后查询是:select * from xyz.food 试试这个,这会工作

                  【讨论】:

                    【解决方案12】:

                    我也遇到过同样的问题,但使用授予权限解决了,

                    当我使用以下查询运行独立应用程序时,它们没有错误:

                    String sql = "select * from SCHEMA_NAME.TABLE_NAME";
                    Statement stmt = con.createStatement();
                    ResultSet rs = stmt.executeQuery(sql);
                    

                    但是当我通过基于 Web 的应用程序运行时,因为每个用户都有不同的角色和权限。如果用户没有特定的 SELECT 权限,则会导致错误。

                    如果 USER_ROLE 没有选择权限,则用于 TABLES。然后导致以下错误为ORA-00942: Table or view does not exist:

                    GRANT (Transact-SQL) - 为表添加 SELECT 权限:

                    GRANT SELECT ON SCHEMA_NAME.TABLE_NAME TO "USER_ROLE";
                    GRANT SELECT, INSERT, UPDATE ON SCHEMA_NAME.TABLE_NAME TO "USER_ROLE";
                    GRANT SELECT, DELETE ON SCHEMA_NAME.TABLE_NAME TO "USER_ROLE";
                    
                    Caused by: java.sql.SQLSyntaxErrorException: ORA-00942: Table or view does not exist
                    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
                    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
                    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
                    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
                    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
                    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
                    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:193)
                    at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:873)
                    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
                    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
                    at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1491)
                    at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:406)
                    

                    如果 USER_ROLE 没有执行权限,则用于存储过程。然后导致以下错误为Internal Error: Inconsistent catalog view

                    添加EXECUTE privilege for Stored Procedure/Functions:

                    GRANT DEBUG ON SCHEMA_NAME.PROCEDURE_NAME TO "USER_ROLE";
                    GRANT EXECUTE ON SCHEMA_NAME.PROCEDURE_NAME TO "USER_ROLE";
                    
                    java.sql.SQLException: Internal Error: Inconsistent catalog view
                    at oracle.sql.StructDescriptor.initMetaData1_9_0(StructDescriptor.java:1420)
                    

                    【讨论】:

                      猜你喜欢
                      • 2016-09-17
                      • 2019-01-22
                      • 2015-11-09
                      • 2011-12-10
                      • 2015-01-30
                      • 2020-10-16
                      • 2018-02-05
                      相关资源
                      最近更新 更多