JDBC插入查询不会在oracle数据库中插入记录

时间:2014-11-07 19:47:34

标签: java jdbc oracle11g oracle-spatial

我已经成功建立了数据库连接,但是当我通过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;

2 个答案:

答案 0 :(得分:1)

除非您的连接处于自动提交模式 * ,否则在致电close()之前应致电commit()

  

强烈建议应用程序在调用close方法之前显式提交或回滚活动事务。如果调用close方法并且存在活动事务,则结果是实现定义的。

看起来Oracle的行为是回滚事务。以下是解决此问题的方法:

try
{
    Statement statement = connection.createStatement();
    statement.executeUpdate(insert);
    connection.commit(); // <====== Here
    System.out.println("Inserted record in the table");
}catch(SQLException e)
{
    System.out.println("Error due to SQL Exception");
    e.printStackTrace();
}

此外,最好在INSERT语句中明确列出要插入的列:

String insert = "insert into table1 (col1, col2) values('p0', MDSYS.SDO_POINT_TYPE(228,102, null))";

col1col2替换为实际列的名称。另请考虑参数化插入内容,并使用PreparedStatement


* 很少推荐这样做。

答案 1 :(得分:1)

我看到你修复了你的代码以正确提交它现在有效。

但我想指出你所做的事情毫无意义。 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, 使用Oracle Spatial的java API,它允许您在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文档中了解有关Oracle Spatial的更多信息。