[SQL] 테이블 이름을 설정하는 문 준비를 사용하여
SQL테이블 이름을 설정하는 문 준비를 사용하여
나는 데이터를 선택하는 테이블 이름을 설정하는 준비된 문을 사용하려고 해요,하지만 난 쿼리를 실행하면 오류가 계속.
오류 및 샘플 코드는 아래에 표시됩니다.
[Microsoft][ODBC Microsoft Access Driver] Parameter 'Pa_RaM000' specified where a table name is required.
private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [?]"; //?=date
public Execute(String reportDate){
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn = DriverManager.getConnection(Display.DB_MERC);
PreparedStatement st = conn.prepareStatement(query1);
st.setString(1, reportDate);
ResultSet rs = st.executeQuery();
이 원인이 될 수있는 것에 대한 어떤 생각?
해결법
-
==============================
1.테이블 이름은 매개 변수로 사용할 수 없습니다. 그것은 하드 코딩해야합니다. 당신이 뭔가를 같이 할 수 있습니다 :
테이블 이름은 매개 변수로 사용할 수 없습니다. 그것은 하드 코딩해야합니다. 당신이 뭔가를 같이 할 수 있습니다 :
private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + "?]";
-
==============================
2.이 해결 방법으로 기술적으로 가능하지만, 아주 나쁜 관행.
이 해결 방법으로 기술적으로 가능하지만, 아주 나쁜 관행.
String sql = "IF ? = 99\n"; sql += "SELECT * FROM first_table\n"; sql += "ELSE\n"; sql += "SELECT * FROM second_table"; PreparedStatement ps = con.prepareStatement(sql);
당신이 first_table에서 선택하고자 할 때 그리고 당신은 함께 매개 변수를 설정
ps.setInt(1, 99);
또는하지 않을 경우, 당신은 다른 뭔가로 설정합니다.
-
==============================
3.많은 사람들이 말했듯이, 당신은 조건의 일부로 만 변수, 테이블 이름에 대한 문 매개 변수를 사용할 수 없습니다.
많은 사람들이 말했듯이, 당신은 조건의 일부로 만 변수, 테이블 이름에 대한 문 매개 변수를 사용할 수 없습니다.
사실을 기반으로 두 개의 테이블 이름 (적어도), 아마도 당신이 저장하는 엔티티를 받아 준비된 문을 반환하는 방법을 만드는 것이 최선의 변수 테이블 이름을 가지고있다.
PreparedStatement p = createStatement(table);
-
==============================
4.당신은 SQL 주입에 취약하지 않은 솔루션을 필요로하는 경우, 당신은 당신이 필요로하는 모든 테이블에 대한 쿼리를 복제 할 필요가 :
당신은 SQL 주입에 취약하지 않은 솔루션을 필요로하는 경우, 당신은 당신이 필요로하는 모든 테이블에 대한 쿼리를 복제 할 필요가 :
final static String QUERIES = { "SELECT x FROM Table1 x WHERE a=:a AND b=:b AND ...", "SELECT x FROM Table2 x WHERE a=:a AND b=:b AND ...", "SELECT x FROM Table3 x WHERE a=:a AND b=:b AND ...", ... };
그리고 예 : 쿼리는 중복 만 테이블 이름 다르다입니다.
지금 당신은 간단하게 예를 들어, 테이블에 맞는 쿼리를 선택 처럼
... PreparedStatement st = conn.prepareStatement(QUERIES[index]); ...
당신은이 방법을 사용할 수 있습니다 느릅 나무 JPA, 최대 절전 모드, 어떤 ...
좀 더 자세한 방법을 원하는 경우에 열거 등을 이용하여 고려
enum AQuery { Table1("SELECT x FROM Table1 x WHERE a=:a AND b=:b AND ..."), Table2("SELECT x FROM Table2 x WHERE a=:a AND b=:b AND ..."), Table3("SELECT x FROM Table3 x WHERE a=:a AND b=:b AND ..."), ... private final String query; AQuery(final String query) { this.query = query; } public String getQuery() { return query; } }
이제 중 인덱스를 사용
String sql = AQuery.values()[index].getQuery(); PreparedStatement st = conn.prepareStatement(sql); ...
또는 테이블 이름을 사용
String sql = AQuery.valueOf("Table1").getQuery(); PreparedStatement st = conn.prepareStatement(sql); ...
-
==============================
5.이 힘 도움말 :
이 힘 도움말 :
public ResultSet getSomething(String tableName) { PreparedStatement ps = conn.prepareStatement("select * from \`"+tableName+"\`"); ResultSet rs = ps.executeQuery(); }
-
==============================
6.나는 확실히 당신은 테이블의 이름, 일부 필드의 단지 값을 지정하는 PreparedStatement로 사용할 수 있습니다 아니에요. 어쨌든, 당신은 괄호없이, 동일한 쿼리를 시도하지만 수 :
나는 확실히 당신은 테이블의 이름, 일부 필드의 단지 값을 지정하는 PreparedStatement로 사용할 수 있습니다 아니에요. 어쨌든, 당신은 괄호없이, 동일한 쿼리를 시도하지만 수 :
"SELECT plantID, edrman, plant, vaxnode FROM ?"
-
==============================
7.
String table="pass"; String st="select * from " + table + " "; PreparedStatement ps=con.prepareStatement(st); ResultSet rs = ps.executeQuery();
from https://stackoverflow.com/questions/1208442/using-prepared-statements-to-set-table-name by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL 쿼리를 여러 수를 얻으려면? (0) | 2020.03.15 |
---|---|
[SQL] 오라클은 다음과 같은 경우 테이블 존재 (0) | 2020.03.15 |
[SQL] 문자열을 저장하는 데이터 유형 "텍스트"를 사용하는 모든 단점? (0) | 2020.03.15 |
[SQL] PreparedStatement의에하여 setDate 사용 (0) | 2020.03.15 |
[SQL] 어떻게 MySQL의에서 이름 문자열을 분할하는? (0) | 2020.03.15 |