当我尝试使用以下代码从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();
}
}
}
答案 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)
请按照以下步骤操作
SELECT table_name, owner, tablespace_name FROM all_tables;
答案 6 :(得分:0)
我也面临着同样的问题, 解决方法是:
还要检查, 真正 更新
答案 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。解决方案的原因很多。