# SQL und ?



## EOB (12. Okt 2006)

hi, was bedeuet eigentlich das ? in einer sql abfrage. hier ein beispiel:

_
SELECT to_page,SUM(clicks) FROM (SELECT to_page,SUM(clicks) AS clicks FROM redirect WHERE LOWER(to_page) LIKE ? AND interval_start>=? AND interval_start<=? GROUP BY to_page) HAVING SUM(clicks)>=? GROUP BY to_page ORDER BY SUM(clicks) desc
_

danke


----------



## Roar (12. Okt 2006)

wenn du aus diesem string ein PreparedStatement machst, kannst du mit methoden von PreparedStatement die ? durch richtige werte ersetzen. ich nehme an da hast du den schnipsel her?


----------



## EOB (12. Okt 2006)

also das sieht so aus. ich muss mich hier durch eine riiiiesige webanwendung fitzen und nen bug finden. also das ist ein teil des codes:


```
//sql ist eben die query mit ? drin
PreparedStatement stmt = conn.prepareStatement(sql);

int maxRows = getMaxRows(req);
if (maxRows > 0) {
    stmt.setMaxRows(maxRows);
}
            
DB.prepareStatement(stmt, param);
            
ResultSet rs = stmt.executeQuery();
            
// Read results
            
while (rs.next()) {
                
                ItemBean item = new ItemBean();
                
                // Check which columns should be fetched
                String s = (String)req.get(SearchRequestBean.FETCH_FROM);
                              
                
                if (s != null && !"".equals(s)) {
                    item.put(ItemBean.FROM_PAGE, rs.getString(DBHelper.DB_FROM_PAGE));
                }
                s = (String)req.get(SearchRequestBean.FETCH_CATEGORY);
                if (s != null && !"".equals(s)) {
                    item.put(ItemBean.CATEGORY, rs.getString(DBHelper.DB_CATEGORY));
                }
                s = (String)req.get(SearchRequestBean.FETCH_TO);
                if (s != null && !"".equals(s)) {
                    item.put(ItemBean.TO_PAGE, rs.getString(DBHelper.DB_TO_PAGE));
                }
                item.put(ItemBean.CLICKS, "" + rs.getInt(SQL.sum(DBHelper.DB_CLICKS)));
                
                
                
                li.add(item);
}
```

werden da die ? gesetzt? sieht ja so aus, wuerde ich sagen. also mittels rs.getString? danke


----------



## SlaterB (12. Okt 2006)

DB.prepareStatement(stmt, param); 

sieht aus wie eine Operation, die eine Menge an Parametern in das Statement einfügt,

evtl. kannst du direkt dahinter ein
stmt.toString() machen und siehst die Parameter, weiß nicht ob es dafür eine Operation gibt,

alternativ gibt es sicher sowas wie getAllParameters(),
womit du dir eine allgemeine Operation schreiben kannst,
die dann zumindest das SQL + dahinter die Parameter aufführt,

oder das params-Objekt gibt seine Parameter preis, oder ähnliches

----------

rs.getString() arbeitet auf dem RESULTSET,
also dem Ergebnis der Anfrage NACH der Anfrage  (nach executeQuery())
da die Parameter zu setzen wäre etwas spät, zumal Parameter setzen logischerweise was mit setX() zu tun haben sollte, 
und natürlich dem PreparedStatement-Objekt


mit rs.getString() werden einzelne Attribute eines Datensatzes gelesen


----------



## SamHotte (12. Okt 2006)

Normal braucht man PreparedStatements nicht für SELECT-Abfragen, sondern für INSERT oder UPDATE; gefüllt werden die '?' normalerweise so (ohne Exceptions etc.):


```
String sql = "INSERT INTO meinerelation VALUES (?,?,?)";
PreparedStatement pstmt = Connection.prepareStatement(sql);
pstmt.setInt(1, meinIntegerWert);
pstmt.setString(2, meinStringWert);
pstmt.setDate(3, meinDatumsWert);
int rows = pstmt.executeUpdate();
```

_edit_ steht aber auch in der API unter Interface java.sql.PreparedStatement  :meld:


----------



## Caffè Latte (12. Okt 2006)

Hi,

warum braucht man Prepared Statements nicht für SELECT-Abfragen? Wenn sich die Abfrageparameter zur Laufzeit ständig ändern hat doch ein präkompiliertes Statement ebenso enorme Vorteile - oder?


----------



## SamHotte (13. Okt 2006)

Stimmt schon - ich benutz' das nur selten, weil ich meine Daten immer komplett einlese, bevor ich das arbeiten anfange - daher hab ich immer nur "SELECT * ..." 

Für die WHERE-Klauseln kann man das ? natürlich genauso gut gebrauchen. War ungeschickt formuliert, sorry!


----------



## Caffè Latte (13. Okt 2006)

OK, ich dachte schon was verpasst zu haben.


----------

