SQL und ?

Status
Nicht offen für weitere Antworten.

EOB

Top Contributor
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 :)
 
R

Roar

Gast
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

Top Contributor
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:

Code:
//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 :)
 
S

SlaterB

Gast
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

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

Code:
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

Bekanntes Mitglied
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

Top Contributor
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!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben