2013-07-11 2 views
1

서블릿의 데이터베이스 (Oracle10)에 연결하는 데 JDBC을 사용하고 있습니다.
다음은 세 가지 매개 변수를 동적으로 설정하려는 내 쿼리입니다.오라클 예외 : 잘못된 테이블 이름

  1. 테이블 이름
  2. 열 이름

검색어 :

query = "select ? from ? where ? = ?"; 
mypstmt = con.prepareStatement(query); 
mypstmt.setString(1, tableName); 
mypstmt.setString(2, columnName); 
mypstmt.setString(3, columnName2); 
mypstmt.setString(4, value); 

그러나 쿼리 위

나에게 오류를주고있다 :

java.sql.SQLException: ORA-00903: invalid table name 

테이블 이름을 확인했습니다. 그것은 정확하고, 같은 질문을 작성하는 경우 :

query = "select "+columnName+" from "+tableName+" where "+columnName2+" = ?"; 

그러면 잘 실행됩니다.

그래서 내가 무엇을해야하는지 나는 mypstmt.setString(1,tableName)

로 EDIT1 나는 Table nameColumn name 내가/테이블을 입력 사용자가 선택할 수 있도록하고 있다는 점이다 parameterize 할 이유를 Table nameColumn Names을 설정하려면 이름과 열 이름이 있으므로 SQL Injection을 피하고 싶습니다.

답변

4

테이블 이름을 바인드 변수로 사용할 수 없으므로 tablename을 PreparedStatement에 직접 전달할 수 없습니다. PreparedStatement.

An object that represents a precompiled SQL statement.

A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

당신은 문자열 연결과 SQL을 구성해야합니다. 저장 프로 시저를 사용하면 Dynamic SQL을 사용하여 테이블 이름을 동적으로 전달할 수 있습니다. 심지어 제한적 이유를 이해하려면 this SO answer을보십시오.

+0

'PreparedStatement'를 사용하여 열 이름을 매개 변수로 전달할 수 있습니까? – user75ponic

+1

@Polppan - no. 값만 매개 변수로 전달할 수 있습니다. (그렇지 않으면 SQL 엔진이 준비된 명령문을 사전 컴파일/계획 할 수없고 주사 공격 등의 범위가 더 커질 수 있습니다.) –

+0

아니오 ................. ..... – NINCOMPOOP

2

SQL 쿼리에서 ? 열 값만 매개 변수화 할 수 있습니다. 테이블/열 parametrizing 할 수없는 대신 예를 들어, 같은 쿼리를 구성하는 변수를 사용합니다

void query(String tableName, String columnName, String queryColumnName String val) { 
String query = "select "+columnName+" from "+tableName+" where "+queryColumnName+" = ?"; 
mypstmt.setString(1, val); 
.. 
} 
1

의 PreparedStatement에서 당신은 단지 값을 대체 할 수 있습니다. tablename 또는 열 이름을 바꿀 수 없습니다.

관련 문제