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

时间:2016-04-28 10:08:40

标签: java oracle

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

12 个答案:

答案 0 :(得分:7)

如果您的表位于架构A:

select * from A.food

修改

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

答案 1 :(得分:2)

这将解决问题:

打开 hibernate.cfg.xml 文件

  

正确检查映射

     

<mapping class="com.xyz.abc.java"/>

还请确保以下行:

  

<property name="hibernate.hbm2ddl.auto">update</property>

答案 2 :(得分:1)

我遇到了同样的问题,类似的东西对我有用:

<button>

答案 3 :(得分:1)

我遇到此错误,解决方案是执行:

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

请按照以下步骤操作

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

答案 6 :(得分:0)

我也面临着同样的问题, 解决方法是:

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

还要检查, 真正 更新

答案 7 :(得分:0)

对于我来说,我解决了执行问题:

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

答案 8 :(得分:0)

一些可能的解决方案是:

  

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

例如: 我的原始数据库具有管理员 SYSTEM ,然后创建了一个用户 Toad ,并在此用户下我已经创建了表 Food 的Toad模式。

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

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

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

  

或者,您可以通过 SchemaName.DatabaseName 指定表,在这种情况下,该表分别为 Toad Food

因此查询如下:

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

答案 9 :(得分:0)

您应该提到Schema.table,例如Schema name = xyz,那么查询将是:select * from xyz.food尝试一下,这将起作用

答案 10 :(得分:0)

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

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

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

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

对于TABLES,如果USER_ROLE没有选择权限。然后导致以下错误为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)

答案 11 :(得分:-1)

阅读this。解决方案的原因很多。