Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

saxo
**
Beiträge: 47
Registriert: Do, 01.04.2010 00:45

Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Beitrag von saxo »

Hallo, in eine Tabellenspalte PEOPLE.UUID sollen UUIDs mit Hilfe der Funktion UUID() geschrieben werden (gibt String zurück).
Komme mit den Anführungszeichen noch nicht klar und weiß nicht ob executeUpdate stimmt?

vDataSource = ThisDataBaseDocument.CurrentController
If NOT (vDataSource.isConnected()) THEN vDataSource.connect()
vStatement = vDataSource.ActiveConnection.createStatement()
s = "SELECT CASE WHEN "PEOPLE"."UUID" IS NULL THEN "PEOPLE"."UUID" = UUID(0,0) END FROM "PEOPLE""
vStatement.executeUpdate(s)
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Beitrag von RobertG »

Doppelte Anführungszeichen innerhalb von Texten müssen durch doppelte Anführungszeichen maskiert werden. Deswegen lauter Doppler.

Das ganze was Du da aufschreibst, ist eine Abfrage. Es beginnt mit SELECT. Deswegen passt auch nicht executeUpdate.

Die Funktion UUID gibt es bei den internen Datenbanken nicht. Da gibt es bloß bei Firebird die Möglichkeiten, Texte in UUID zu überführen. Hier musst Du schon klarer werden, mit was für einer Datenbank Du denn da arbeitest.
saxo
**
Beiträge: 47
Registriert: Do, 01.04.2010 00:45

Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Beitrag von saxo »

UUID() ist eine eigene Funktion die 36 characters zurückgibt.
Das mit den Anführungszeichen bekomme ich jetzt ohne Fehlermeldung hin, weiß aber nicht, wie man dann das Feld UUID aller Datensätze einer bestehenden Tabelle beschreibt?
"Update" habe ich gefunden, damit geht aber leider nicht das Beschreiben mit unterschiedlichen UUIDs.
Ich nehme die normale Libreoffice Datenbank

Code: Alles auswählen

Sub UUID(lowercase As Boolean, braces As Boolean) As String
	'Native VBA function to create a GUID / UUID type 4 that does not rely upon Scriptlet. TypeLib or any external library.
	'Save UUID as binary(16 bytes) without "-" or as char(36) with 4 "-"
	'To produce numbers between a range: Fix(Rnd * (topnumber - bottomnumber + 1) + bottomnumber)
	'GUID(1, 0): 3c763963-7a55-41c5-a04e-401955387e5c, GUID(False, True): {4B98B15B-8B21-49A4-ACEB-58879135D227}
	Dim k&, h$, s$
	s = Space(36)
	For k = 1 To 36
		Randomize()
		Select Case k
			Case 9, 14, 19, 24: h = "-"
			Case 15: h = "4"
			Case 20: h = Hex(Fix(Rnd * 4 + 8))	'must be 8,9,A or B
			Case Else: h = Hex(Fix(Rnd * 16))	'Int() or Fix() rounds down! Fix() and Rnd() return type double
		End Select
		Mid(s, k, 1, h)
	Next
	If lowercase Then s = LCase$(s)
	If braces Then UUID = "{" & s & "}" Else UUID = s
End Sub
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Beitrag von RobertG »

Versuche einmal

Code: Alles auswählen

s = "UPDATE ""PEOPLE"" SET ""UUID"" = '" + UUID(0,0) + "' WHERE ""UUID"" IS NULL"
vStatement.executeUpdate(s)
Das macht ein Udpate und fragt nicht Inhalte ab wie SELECT. Außerdem wird die Varibale eingebaut. Nur: die UUID wird für alle Datensätze gleich, weil das ja keine Datenbankfunktion ist sondern eine String, den Du da weiter gibst - mit einem Wert für UUID. Deswegen müsstest Du vermutlich erst einmal eine Abfrage starten, die die Primärschlüssel von den Leuten ausliest, die keine UUID haben. Und dann müsstest Du ein Update auf jeden dieser Schlüsselwerte machen. Also vielleicht so:

Code: Alles auswählen

vStatement1 = vDataSource.ActiveConnection.createStatement()
stSql = "SELECT ""ID"" FROM ""PEOPLE"" WHERE ""UUID"" IS NULL"
oResult = vStatement1.executeQuery(stSql)
WHILE oResult.next
loID = oResult.getLong(1)
s = "UPDATE ""PEOPLE"" SET ""UUID"" = '" + UUID(0,0) + "' WHERE ""ID""='"+loID+"'"
vStatement.executeUpdate(s)
WEND
Du hast hier 2 Statements. Zuerst die Abfrage nach den leeren Datensätzen, dann das Einfügen jedes neuen Datensatzes mit jeweils unterschiedlicher UUID, weil die Funktion von Dir diese ID wiedergibt.

Gruß

Robert
saxo
**
Beiträge: 47
Registriert: Do, 01.04.2010 00:45

Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Beitrag von saxo »

Fehler in WHILE oResult.next: Type: com.sun.star.lang.DisposedException Message: .
Der Punkt gefällt ihm nicht :shock:
Vielleicht die UUIDs in die Abfrage schon reinschreiben und dann das Abfrageergebnis in die Tabelle kopieren?
Bin einfach zu schlecht in SQL...
Nochmal edit: es funktioniert halb, er schreibt trotz der Fehlermeldung eine UUID in den ersten Datensatz, d.h. er macht die Schleife nur einmal
saxo
**
Beiträge: 47
Registriert: Do, 01.04.2010 00:45

Re: Von Base aus eine Tabelle beschreiben oder: ich bring den um der die Gänsefüße erfunden hat

Beitrag von saxo »

Jetzt hab ich's. Muss natürlich das zweite Statement auch noch connecten:

Code: Alles auswählen

	vStatement = vDataSource.ActiveConnection.createStatement()
	vStatement1 = vDataSource.ActiveConnection.createStatement()
	stSql = "SELECT ""P_NR"" FROM ""PEOPLE"" WHERE ""UUID"" IS NULL"
	DIM oResult As Object, loID&
	oResult = vStatement.executeQuery(stSql)
	WHILE oResult.next
		loID = oResult.getLong(1)
		s = "UPDATE ""PEOPLE"" SET ""UUID"" = '" + UUID(0,0) + "' WHERE ""P_NR""='"+loID+"'"
		vStatement1.executeUpdate(s)
	WEND
Vielen Dank, Problem gelöst!
Antworten