Я не могу визуализировать таблицу в базе oracle, которая находится в контейнере из java - PullRequest
0 голосов
/ 06 февраля 2020

Добрый день,
У меня довольно странная проблема. Я не могу визуализировать из Java таблицу, которая находится в базе данных Oracle, смонтированной с контейнером Docker. От SQL Разработчик я могу подключиться и все нормально, я визуализирую свою таблицу, но при этом из java я получаю ошибку, что таблица не найдена:

Основной класс:

package BaseDeDatos;

import java.sql.ResultSet;
import java.sql.SQLException;

public class Conexion {

    public static void main(String[] args) {
        MyConexion conexion=new MyConexion();
        ResultSet resultado;
        String cedula,nombre, apellido;

        resultado=conexion.getQuery("Select * from Cliente");

        try {
            while(resultado.next()){
                cedula = resultado.getString("cedula");
                nombre = resultado.getString("nombre");
             //   apellido = resultado.getString("apellido");

                System.out.println("Nombre: "+cedula+"\nRut: "+nombre);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Моя конфигурация для доступа к базе данных

package BaseDeDatos;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MyConexion {

    private String user = "cesar";
    private String password = "xxxxxxx123";

    static String url = "jdbc:oracle:thin:@//10.164.7.203:1521/ORCLPDB1.localdomain";
    private Connection conn = null;

    public MyConexion() {
        try {
            Class.forName("oracle.jdbc.OracleDriver");
            conn = (Connection) DriverManager.getConnection(url, user, password);

            if (conn != null) {
                System.out.println("Conexion a base de datos " + url + " . . . Ok");
            }
        }
        catch (SQLException ex) {
            System.out.println("Hubo un problema al intentar conecarse a la base de datos" + url);
        }
        catch (ClassNotFoundException ex) {
            System.out.println("Error... " + ex);
        }
    }

    /**
     * Consultas a la Base de Datos.
     * 
     * @param _query
     * @return
     */
    public ResultSet getQuery(String _query) {
        Statement state = null;
        ResultSet resultado = null;
        try {
            state = (Statement) conn.createStatement();
            resultado = state.executeQuery(_query);
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        return resultado;
    }
}

Когда я пытаюсь подключиться с java:

enter image description here

Выполнение запроса в SQL Разработчик:

enter image description here

Подробная информация о моем правильном соединении с SQL Разработчик:

enter image description here

При работе:

select owner, table_name from all_tables where table_name = 'CLIENTE';
select * from dba_tab_privs where table_name = 'CLIENTE' and privilege = 'SELECT';

enter image description here

Что это может быть? Я не понимаю

Ответы [ 2 ]

2 голосов
/ 06 февраля 2020

Oracle ошибки могут иногда вводить в заблуждение. Вы также получаете этот Oracle код ошибки ...

ORA-00942: таблица или представление не существует

, когда таблица существует, но пользователь не существует иметь разрешение на доступ к таблице.
Другими словами, пользователь cesar не имеет доступа к таблице базы данных CLIENTE.

Кстати, согласно тому, что вы разместили, кажется, есть два CLIENTE таблицы. Один в схеме SYS и один в схеме SYSTEM. Этот Stack Exchange Q & A описывает разницу между схемами, а также рекомендует не создавать пользовательские таблицы в этих схемах. Следовательно, я бы рекомендовал создать таблицу CLIENTE в cesar схеме. Тогда вы не получите ошибку ORA-00942. Если вы не можете этого сделать, то вам нужно предоставить доступ к таблице CLIENTE пользователю cesar следующим образом:

GRANT SELECT ON CLIENTE TO cesar

Обратите внимание, что вам нужно выполнить приведенный выше оператор как владелец таблицы, Например, сначала подключитесь к базе данных как SYSTEM, а затем выполните приведенный выше оператор. Помните, что пользователю cesar необходимо получить доступ к таблице как SYSTEM.CLIENTE.

select * from SYSTEM.CLIENTE
.
0 голосов
/ 06 февраля 2020

Таким образом, комментарий kfinity должен был указать вам на то, что действительно произошло. Но вот объяснение, которое я подозреваю.

Вы подключились к базе данных как SYSDBA, когда создали таблицу CLIENTE. В результате эта таблица является собственностью пользователя системы. Учитывая это с вашим соединением SYSDBA, вы можете видеть содержимое таблицы.

Приложение Java подключается не как SYSDBA, а как обычный пользовательский цезарь. В результате все ваши выборки, запущенные из Java, будут выполнены для схемы цезаря, где, конечно, таблица CILENTE не существует.

Чтобы это исправить, просто воссоздайте таблицу и заполните ее данными в схеме цезаря .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...