# prepared statements in groovy



## turmaline (19. Aug 2010)

Hallo Leute,

mal zwangsläufig muss ich groovy kennenlernen. Das Aufgabe ist dabei Dateien aus einer Datenbank zu exportieren. Dabei wurde die Anfrage in zwei Teile getrennt. Im ersten Teil der Anfrage (query_documents) werden zunächst einmal allgemeine Daten abgefragt und daraus filename erstellt. Dann wird es im oldDocHome geschaut, ob eine Datei mit diesem Namen bereits existiert. Wenn ja, dann wird diese Datei einfach in docHome kopiert (statt sie aus der Datenbank zu exportieren). Wenn nicht, wird blob_data (query_blob) abgefragt und die Datei aus der Datenbank exportiert.

Es funktioniert leider nicht((( Und da ich mich mit Syntax so gut wie gar nicht auskenne, sehe ich meine Fehler nicht. Bei Ausführung bekomme ich:
No such property: blobref_id


```
String query_documents = """SELECT a.id id, a.version version, e.language language, e.name name, e.blobref_id blobref_id 
		FROM ${tableuser}.attachment_entry e, ${tableuser}.attachment_entries ae, ${tableuser}.attachment a, ${tableuser}.attachment_blob b
		WHERE e.id = ae.attachment_entry_id AND a.id = ae.attachment_id AND e.blobref_id = b.id AND a.id > 3000 AND a.id < 3011"""
    logger.debug("About to query: $query_documents")
	sql.withStatement { stmt -> 
		//stmt.fetchSize = 10
		//stmt.maxFieldSize = 30000000
		//logger.debug("fetchSize=${stmt.fetchSize}, maxFieldSize=${stmt.maxFieldSize}")
	}
	sql.eachRow(query_documents) {
		String lang = it.LANGUAGE != null ? it.LANGUAGE : "null"
		String ext = getExtension(it.NAME)
		String filename = "${it.ID}.${it.VERSION}.${lang}.${ext}"
			
		// look for filename in olddata dir
		File thisFile = new File ("$oldDocHome/$module", filename)
		// if it exists copy it
		if (thisFile.exists()) {
			try {
		        FileUtils.copyFile(thisFile, new File ("$docHome/$module", thisFile.getName ()));
		        //logger.debug("Copying of " + fileName)
		    } catch (IOException e) {
		        e.printStackTrace();
		    }
		} 
		else {
			String query_blob = "SELECT blob_data from ${tableuser}.attachment_blob WHERE blobref_id = :id"
			sql.eachRow(query_blob, [id: blobref_id]) { row ->
			writeBlob(filename, row.getBinaryStream("BLOB_DATA"), module)}
		} 
		
	} // for each row in query_documents
```

Kann mir jemand helfen?

Gruß, madlena


----------



## turmaline (19. Aug 2010)

sorry Leute, wahrscheilich habe ich die Frage im falschen Forum erstellt..((


----------



## maki (19. Aug 2010)

*verschoben*


----------



## bygones (20. Aug 2010)

hab leider in groovy noch kein sql gemacht, aber 
[groovy]sql.eachRow(query_blob, [id: blobref_id]) { row ->[/groovy]
hier verwendest du die blobref_id Variable, die aber nirgends definiert wurde, daher findet er sie auch nicht


----------



## turmaline (20. Aug 2010)

bygones hat gesagt.:


> hier verwendest du die blobref_id Variable, die aber nirgends definiert wurde, daher findet er sie auch nicht



doch die lasse ich mir von der ersten anfrage liefern. syntak war etwas falsch. so funktioniert es!

[groovy]
String query_blob = "SELECT blob_data from ${tableuser}.attachment_blob WHERE id = ?"
  sql.eachRow(query_blob, [it.blobref_id]) { row ->
[/groovy]

bei der ausführung der query_blob-anfrage, wird ein argument übergeben, das wert für welches aus der ersten anfrage stammt.


----------



## bygones (20. Aug 2010)

passts jetzt ? zwischen [c]blobref_id[/c] und [c]it.blobref_id[/c] ist ja n ordentlicher Unterschied


----------



## turmaline (20. Aug 2010)

bygones hat gesagt.:


> passts jetzt ? zwischen [c]blobref_id[/c] und [c]it.blobref_id[/c] ist ja n ordentlicher Unterschied



hast recht


----------

