복붙노트

[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. ==============================

    1.테이블 이름은 매개 변수로 사용할 수 없습니다. 그것은 하드 코딩해야합니다. 당신이 뭔가를 같이 할 수 있습니다 :

    테이블 이름은 매개 변수로 사용할 수 없습니다. 그것은 하드 코딩해야합니다. 당신이 뭔가를 같이 할 수 있습니다 :

    private String query1 = "SELECT plantID, edrman, plant, vaxnode FROM [" + reportDate + "?]";
    
  2. ==============================

    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. ==============================

    3.많은 사람들이 말했듯이, 당신은 조건의 일부로 만 변수, 테이블 이름에 대한 문 매개 변수를 사용할 수 없습니다.

    많은 사람들이 말했듯이, 당신은 조건의 일부로 만 변수, 테이블 이름에 대한 문 매개 변수를 사용할 수 없습니다.

    사실을 기반으로 두 개의 테이블 이름 (적어도), 아마도 당신이 저장하는 엔티티를 받아 준비된 문을 반환하는 방법을 만드는 것이 최선의 변수 테이블 이름을 가지고있다.

    PreparedStatement p = createStatement(table);
    
  4. ==============================

    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. ==============================

    5.이 힘 도움말 :

    이 힘 도움말 :

    public ResultSet getSomething(String tableName) {
    
    PreparedStatement ps = conn.prepareStatement("select * from \`"+tableName+"\`");
    ResultSet rs = ps.executeQuery();
    }
    
  6. ==============================

    6.나는 확실히 당신은 테이블의 이름, 일부 필드의 단지 값을 지정하는 PreparedStatement로 사용할 수 있습니다 아니에요. 어쨌든, 당신은 괄호없이, 동일한 쿼리를 시도하지만 수 :

    나는 확실히 당신은 테이블의 이름, 일부 필드의 단지 값을 지정하는 PreparedStatement로 사용할 수 있습니다 아니에요. 어쨌든, 당신은 괄호없이, 동일한 쿼리를 시도하지만 수 :

    "SELECT plantID, edrman, plant, vaxnode FROM ?"
    
  7. ==============================

    7.

    String table="pass"; 
    
    String st="select * from " + table + " ";
    
    PreparedStatement ps=con.prepareStatement(st);
    
    ResultSet rs = ps.executeQuery();
    
  8. from https://stackoverflow.com/questions/1208442/using-prepared-statements-to-set-table-name by cc-by-sa and MIT license