Stored Procedures (MySQL) in Base verwenden

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Johanna
Beiträge: 3
Registriert: Di, 05.09.2017 17:25

Stored Procedures (MySQL) in Base verwenden

Beitrag von Johanna »

Liebe Forumsmitglieder,

nach langem Suchen und einer Menge Verzweiflung wende ich mich nun einmal direkt an euch. Ich hoffe, Ihr könnt mir weiterhelfen.

Ausgangslage: Ich möchte erstmals mittels LO Base auf die Datenbestände einer MySQL-DB zugreifen. Hierzu nutze ich Formulare. (So weit, so banal.)

Was ich bisher geschafft habe: Verschiedene, in der DB fest definierte Tabellen von dort abzurufen, in einem Formular darzustellen und untereinander zu verlinken, so dass ich schrittweise eine Art Navigation zum gewünschten Ergebnis hin bekomme. Hilfsmittel: Das Base 5.3-Handbuch.

Woran es nun hapert: Auf dem MySQL-Server befinden sich "stored procedures", die mir Resultate in einer bestimmten Tabellenform liefern. Diese Ausgaben in Base zu benutzen, ist aber alles andere als trivial, was auch der Grund meiner Verzweiflung ist. Durch Recherchen,
bspw. hier im Forum, bin ich darauf gestoßen, dass dies wohl einzig über Makros realisiert werden kann.

Was ich nicht verstehe: Wie setze ich ein Makro so ein, dass es mir den gesamten Inhalt der stored procedure in einem Formular ausgibt? Da ich noch nie mit Makros zu tun hatte, bitte ich um einen präzisen Denkanstoß. Die Tabelle, die mir diese stored procedures liefern, sind genau das, was ich brauche. Ich möchte daher keine Extra-Datenbank-Entwürfe oder was auch immer für LO anfertigen müssen. Nur das, was die DB liefert, nutzen.

Ich habe auch schon in das Dokument OpenOffice.org-Makros Erklärt geschaut, aber das ist eher auf das elementare Grundverständnis der gesamten Materie angelegt. Ich bräuchte aber lediglich einen Hinweise auf den o.g. singulären Anwendungsfall.

Könnt Ihr mir hier bitte weiterhelfen?
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Stored Procedures (MySQL) in Base verwenden

Beitrag von RobertG »

Hallo Johanna,

ich habe bisher nicht mit Stored Procedures gearbeitet, jetzt aber folgenden Weg gefunden:

Ich erstelle eine Prozedur, in der das Ergebnis in eine temporäre Tabelle gespeichert wird. So eine Prozedur sieht in ganz einfacher Form so aus:

Code: Alles auswählen

CREATE PROCEDURE AlleNamen()
Begin
DROP TEMPORARY TABLE IF EXISTS `TempNamen`;
CREATE TEMPORARY TABLE `TempNamen` AS SELECT * FROM `Namen`;
END
Zuerst lösche ich eine vorhergehende temporäre gleiche Tabelle. Dann schreibe ich das Ergebnis meiner Prozedur, hier einfach die Abfrage "SELECT * FROM Namen", in die temporäre Tabelle.
Anschließend lasse ich die Prozedur ablaufen:

Code: Alles auswählen

CALL AlleNamen();
Dann erstelle ich eine Abfrage mit

Code: Alles auswählen

SELECT * FROM `TempNamen`
und bekomme die Namen aus der temporären Tabelle angezeigt.
Jetzt ist es natürlich umständlich, jedes Mal die Prozedur aufzurufen, bevor ich ein Formular öffne. Deshalb packe ich den Aufruf der Prozedur in ein Makro:

Code: Alles auswählen

SUB ProzCall
	oDatenquelle = thisDatabaseDocument.CurrentController
	IF NOT (oDatenquelle.isConnected()) THEN oDatenquelle.connect()
	oVerbindung = oDatenquelle.ActiveConnection()
	oSQL_Anweisung = oVerbindung.createStatement()
	oSql_Anweisung.executeUpdate("CALL `AlleNamen`();")
END SUB
Dieser Weg funktioniert jedenfalls erst einmal. Ohne temporäre Tabelle habe ich das bisher nicht geregelt bekommen.

Gruß

Robert
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Stored Procedures (MySQL) in Base verwenden

Beitrag von RobertG »

Hallo *,

ich habe noch einmal etwas weiter versucht. An die Ausgabe einer Stored Procedure in MySQL kommt Base nicht ran. Das geht wohl nur über die Konsole. Allerdings kannst der Code ausgelesen werden, mit dem die Prozedur erstellt wurde. Dann kann dieser Code erneut ausgeführt werden und im Falle von SELECT-Kommandos auch dargestellt werden:

Code: Alles auswählen

SUB ProzShow
	oDatasource = thisDatabaseDocument.CurrentController
	IF NOT (oDatasource.isConnected()) THEN oDatasource.connect()
	oConnection = oDatasource.ActiveConnection()
	oSQL_Command = oConnection.createStatement()
	oResult = oSql_Command.executeQuery("SHOW CREATE PROCEDURE `AlleNamen`;")
	stProcedure = ""
	WHILE oResult.next
		FOR i = 1 TO oResult.Columns.Count
		stProcedure = stProcedure & " " & oResult.getString(i)
		NEXT		
	WEND
	inStart = InStr(1,stProcedure,"BEGIN",1)+5
	inLength = InStr(1,stProcedure,"END",1) - (InStr(1,stProcedure,"BEGIN",1)+5)
	stProc = Mid(stProcedure, inStart, inLength)
	msgbox stProc	
END SUB
Die msgbox zeigt den Code an, der zwischen BEGIN und END steht. Um jetzt daraus eine funktionierende Abfrage zu konstruieren habe ich nicht genug Beispiele. Codezeilen enden aber mit Semikolon, Ergebniszeilen, die ausgelesen werden können, beginnen mit SELECT.

Das Ganze hat aber den Nachteil, dass natürlich die Prozeduren nicht auf dem Server direkt ausgeführt werden, sondern Abfragen über Basic daraus konstruiert, zum Server geschickt und von dort wieder zurück transportiert werden. Das dürfte vom Zeitaufwand her wenig Sinn machen.

Gruß

Robert
Johanna
Beiträge: 3
Registriert: Di, 05.09.2017 17:25

Re: Stored Procedures (MySQL) in Base verwenden

Beitrag von Johanna »

Lieber Robert,
sei bedankt für Dein Engagement!


Ich habe die Idee mit der temporären Tabelle benutzt, lasse aber alles makro-hafte heraus. Da das resultset, dass die stored procedure erzeugt, sich nicht so häufig ändert, rufe ich diese direkt via MySQL auf und erzeuge mir eine dauerhafte "temporäre" Tabelle, die ich dann mit einfachen Bordmitteln weiterverarbeiten kann, bspw. über "Views".

Da MySQL die Sprache ist, die einigermaßen beherrsche, verlasse ich mich lieber darauf, als mit der Makrosprache eventuell Sicherheitslöcher oder Dateninkonsistenzen herbei zu stottern. Diese ist mir zu unterdokumentiert; alle Beschreibungen, die ich hierzu las, richteten sich an Menschen, die im Grunde schon wussten, was sie wie tun sollen.

(Das ist aber wahrscheinlich zuvorderst ein subjektives Problem.)
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Stored Procedures (MySQL) in Base verwenden

Beitrag von RobertG »

Hallo Johanna,

das einfache Makro im ersten Post von mir müsste keine Probleme bereiten. Alles andere würde ich auch mit Vorsicht einsetzen. Ich komme inzwischen per Makro auch an den Inhalt einer Prozedur, der sonst nur auf der Konsole ausgegeben wird. Nur wenn ich versuche, das dann (weiter per Makro) in eine Tabelle zu schreiben, dann erhalte ich immer einen

Code: Alles auswählen

Commands out of sync; you can't run this command now.
... und danach ist MySQL nicht mehr verfügbar. Warum ich zwar die Werte in einer Messagebox sehen, nicht aber in einen weiteren SQL-Befehl abgeben kann, bleibt mir ein Rätsel.

Ich werde das auf jeden Fall noch in das nächste Handbuch integrieren.

Gruß

Robert
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Stored Procedures (MySQL) in Base verwenden

Beitrag von RobertG »

Ich habe da noch weiter getestet und bin der Ursache für die Probleme von

Code: Alles auswählen

Commands out of sync; you can't run this command now.
auf die Spur gekommen.

Mit dem direkten Treiber unter LO 5.4.1.2 kann ich eine Prozedur genau 1* aufrufen. Danach kommt grundsätzlich die Fehlermeldung, dass "Commands out of sync ..." sind.

Wenn ich mit JDBC als Verbindung arbeite ist dies nicht der Fall.

Stored Procedures sollten also mit dem jeweiligen Treiber vorher getestet werden. Einfach die Prozedur mehrmals hintereinander mit CALL ... unter Extras > SQL aufrufen. Wenn das zweimal hintereinander klappt ist gut. Ansonsten hat die Nutzung von Stored Procedures mit dem jeweiligen Treiber keinen Sinn.

Gruß

Robert
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Stored Procedures (MySQL) in Base verwenden

Beitrag von RobertG »

So, ich habe das Ergebnis zu den Stored Procedures in dem zukünftigen Handbuch zusammengefasst. Einmal in dem Kapitel, in dem der Kontakt zu MySQL beschrieben ist (ohne Makros) und dann noch in dem Kapitel, in dem der Makrokontakt beschrieben wird.

Ich habe dabei über den JDBC-Kontakt auch die Erstellung einer temporären Tabelle mit dem Rückgabewert einer Prozedur erreicht. Es muss also nicht in der Prozedur direkt der Inhalt in eine temporäre Tabelle geschrieben werden, wenn Makros genutzt werden und die Prozeduren nicht bearbeitet werden sollen.

Das jeweils zukünftige Handbuch kann hier eingesehen werden: http://robert.familiegrosskopf.de/lo_hb_dev/.

Gruß

Robert
Antworten