2014-11-07 1 views
2

데이터베이스 연결을 성공적으로 설정했지만 Java를 통해이 코드를 실행할 때 코드가 계속 실행되고 아무 일도 일어나지 않습니다. 아무것도 데이터베이스에 삽입하거나 아무런 예외도주지 않는다는 것을 의미하지 않습니다.JDBC 삽입 쿼리가 오라클 데이터베이스에 레코드를 삽입하지 않습니다.

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; 
+0

할 수 있습니까 DB에서 먼저 동일한 삽입 쿼리를 실행하고 작동하는지 확인하십시오? 이 방법을 사용하면 쿼리에 문제가 있는지 또는 자바 코드인지 나중에 알 수 있습니다. – Lokesh

+0

예 데이터베이스에 직접 삽입 할 때 작동합니다. – user16666

+0

연결 설정은 어떻게되어 있습니까? 그것을 잡으려고 커밋을해야합니까? –

답변

1

연결이 자동 커밋 모드 * 당신이 close()를 호출하기 전에에 commit()를 호출 해에 있지 않는 한 :

그쪽으로 강력히 추천합니다. 응용 프로그램은 close 메소드를 호출하기 전에 명시 적으로 활성 트랜잭션을 커밋하거나 롤백합니다. close 메소드가 호출되고 활성 트랜잭션이 있으면 결과는 구현에 따라 정의됩니다.

오라클의 행동은 트랜잭션을 롤백하는 것처럼 보입니다.

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을 사용하는 것을 고려하십시오.


*이는 거의 추천하지 않습니다.

+0

동의 함, Commit() 참으로 !! – Lokesh

+0

방금 ​​테이블을 삭제하고 다시 만들고 코드를 실행했습니다. 그것은 효과가 있었다. 그러나 커밋을 추가했습니다. 연결을 종료하기 전에 커밋해야한다는 안전성입니다. 감사합니다. – user16666

+0

연결 닫기에서 롤백이 JDBC에 의해 필요하다는 것에 유의하십시오. 과거에 Oracle 드라이버는 실제로 연결 종료시 커밋을 한 소수의 드라이버 중 하나였습니다. –

0

코드를 올바르게 수정했음을 확인했으며 이제는 작동합니다.

하지만 당신이하는 일이 의미가 없다는 것을 지적하고 싶습니다. SDO_POINT_TYPE은 SDO_GEOMETRY 타입 안에서만 사용하도록되어 있습니다. 즉, 반드시 사용해야하는 실제 공간 유형입니다 : 색인 생성, 조회, 다양한 프로세스에서의 사용 (예 : 생성 그것으로부터의 버퍼) 그리고 훨씬 더. 당신의 표에서

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에서 형상을 조작 할 수있는 Oracle Spatial의 Java API를 사용합니다.

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)에 대한 공간 메타 지금 어떤 쿼리를 수행) 공간 인덱스

5

create index us_cities_sx on us_cities 
    indextype is mdsys.spatial_index; 
생성 (테이블을 가정하는 일부의 위치에 충전 된 미국 도시)

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에 대해 더 자세히 읽어 보시기 바랍니다.