Запрос на вставку JDBC не вставляет запись в базу данных оракула

Я успешно установил соединение с базой данных, но не когда я запускаю этот код через Java, мой код продолжает работать и ничего не происходит. Ничто не означает, что оно не вставляется в базу данных и не дает мне никаких исключений.

Я использую типы пространственных данных из Oracle 11g (MDSYS.SDO_POINT_TYPE). Я выполнил этот запрос напрямую в базе данных Oracle 11g, и он отлично работает, но почему-то не вставляет запись, когда я использую ее через код Java.

Я также пробовал использовать простую студенческую таблицу и смог вставить ее с помощью java.

Вот мой фрагмент:

String insert = "insert into table1 values('p0', MDSYS.SDO_POINT_TYPE(228,102, null))";
    try
    {
        Statement statement = connection.createStatement();
        statement.executeUpdate(insert);
        System.out.println("Inserted record in the table");
    }catch(SQLException e)
    {
        System.out.println("Error due to SQL Exception");
        e.printStackTrace();
    }
    try
    {

        connection.close();
        System.out.println("Closing the connection");
    }catch(SQLException e)
    {
        System.out.println("Error in closing connection");
        e.printStackTrace();
    }

Соединение JDBC:

try {
        Class.forName("oracle.jdbc.driver.OracleDriver");

    } catch (ClassNotFoundException e) {
        System.out.println("Where is your Oracle JDBC Driver?");
        e.printStackTrace();
    }
    System.out.println("Oracle JDBC Driver Registered!");

    Connection connection = null;

    try {

        connection = DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:db11g", username,
                pass);


    } catch (SQLException e) {
        System.out.println("Connection Failed!");
        e.printStackTrace();
    }
    if (connection != null) {
        System.out.println("Database connected");
    } else {
        System.out.println("Failed to connect the database");
    }
    return connection;

person user16666    schedule 07.11.2014    source источник
comment
Не могли бы вы сначала запустить тот же запрос на вставку в БД и посмотреть, работает ли он? Таким образом, вы узнаете, если что-то не так с вашим запросом или это код Java, а затем найдете решение.   -  person Lokesh    schedule 07.11.2014
comment
Да, это работает, когда я вставляю прямо в базу данных   -  person user16666    schedule 07.11.2014
comment
Как у вас настроено подключение? Вам нужно вызвать коммит, чтобы он закрепился?   -  person Droid Chris    schedule 07.11.2014
comment
Хорошо, тогда это код Java. Пожалуйста, проверьте ответ @dasblinkenlight ниже. Похоже, вы пропустили commit();   -  person Lokesh    schedule 07.11.2014
comment
Я добавил свой код подключения выше. Я попытался выполнить connection.commit(); Но все равно ведет себя так же. Неудачно !!   -  person user16666    schedule 07.11.2014


Ответы (2)


Я вижу, что вы исправили свой код для правильной фиксации, и теперь он работает.

Но я хочу отметить, что то, что вы делаете, не имеет смысла. SDO_POINT_TYPE не предназначен для использования так, как вы: он предназначен только для использования внутри типа SDO_GEOMETRY: это истинный пространственный тип, который вы должны использовать: индексировать его, запрашивать его, использовать в различных процессах (таких как генерация буфер от него) и многое другое.

Итак, если вы намерены использовать Oracle Spatial:

1) В своих таблицах используйте тип SDO_GEOMETRY. Например:

create table us_cities (
   state char(2),
   name char(50),
   location sdo_geometry,
   primary key (state, name)
);

2) Чтобы вставить строки вручную, сделайте так:

insert into us_cities (state, name, location) 
values (
  'CA',
  'Los Angeles',
  sdo_geometry (2001, 4326, sdo_point_type (-118.411201,34.112101,null),null,null)
);

В реальной жизни вы, очевидно, использовали бы переменные связывания для координат. Или, поскольку вы используете java, используйте java API Oracle Spatial, который позволяет вам манипулировать геометрией в java.

3) Настройте пространственные метаданные для этой таблицы.

insert into user_sdo_geom_metadata (table_name, column_name, diminfo, srid) 
values (
  'US_CITIES', 
  'LOCATION', 
  sdo_dim_array (
    sdo_dim_element('Long', -180, 180, 1), 
    sdo_dim_element('Lat', -90, 90, 1)  
  ), 
  4326 
); 
commit;

4) Создайте пространственный индекс

create index us_cities_sx on us_cities
  indextype is mdsys.spatial_index;

5) Теперь выполните несколько запросов (при условии, что таблица заполнена местоположениями некоторых городов США)

select name, state 
from us_cities
where sdo_within_distance (
  location,
  sdo_geometry (2001, 4326, sdo_point_type (-73.93,40.7,null),null,null),
  'distance=200 unit=km')
= 'TRUE';

Это может вернуть что-то вроде этого:

NAME                 STATE
-------------------- -----
Philadelphia         PA
Allentown            PA
Elizabeth            NJ
Newark               NJ
Jersey City          NJ
Paterson             NJ
Yonkers              NY
Stamford             CT
Bridgeport           CT
New Haven            CT
Waterbury            CT
Hartford             CT
Springfield          MA

13 rows selected.

На этом этапе вам следует больше узнать об Oracle Spatial в документации Oracle.

person Albert Godfrind    schedule 08.11.2014

person    schedule
comment
Согласен, Commit() Действительно!! - person Lokesh; 07.11.2014
comment
Я просто удалил таблицу, создал ее снова и запустил код. Это сработало. Однако я добавил фиксацию, безопасно фиксировать перед закрытием соединения. Спасибо - person user16666; 07.11.2014
comment
Обратите внимание, что откат при закрытии соединения теперь требуется JDBC, в прошлом драйвер Oracle фактически был одним из немногих драйверов, которые выполняли фиксацию при закрытии соединения. - person Mark Rotteveel; 08.11.2014