SELECT in Prozedur / Funktion
Chris
- datenbank
0 Frank (no reg)0 Chris0 King Lully0 Chris0 King Lully0 Chris0 King Lully0 King Lully
0 Jan
Hallo,
weiß jemand wie ich mit einer Prozedur oder Funktion alle Datensätze einer Tabelle abfragen kann und diese dann in PHP ausgeben lassen kann? Danke für die Hilfe!
Gruß Chris
Hallo,
ich weiss es. :)
Da du sicherlich einen Tipp haben willst, wie du es dir selbst machen kannst ...
Naja du schreibst eine Prozedur, in deren "Body" du dann den Code für die Abfrage der Tabelle packst. Und dann rufst du diese Prozedur von PHP auf und verarbeitest deren zurückgegebenes Resultset.
Dazu muss den Datenbanksystem Prozeduren/Funktionen unterstützen, das ist nicht bei allen Systemen der Fall, bei manchen erst ab einer bestimmmten Version. Vielleicht solltest du dazu die Dokumentation deines Datenbanksystems konsultieren. Diese gibt es für gewöhnlich beim Hersteller desselbigen im Internet zur Einsicht.
Ansonsten fehlen noch die Hinweise:
Grüße,
Frank
Danke für die Hinweise.
Felix, dein Tipp ist mir bekannt ;) Also das grundsätzliche Vorgehen ist mir bewusst. Problem ist: Ich weiß nicht wie ich in der Prozedur die einzelnen Zeilen der Tabelle speichern kann. Mein Body würde so aussehen:
SELECT id, bezeichnung INTO v_id, v_bezeichnung from tabelle;
(oder gibt es nicht auch eine möglichkeit mit select * in eine variable die ganze reihe zu schreiben? wenn ja, wie definiere ich den datentyp?)
Wie kann ich jetzt für jeden Datensatz die beiden Variablen an PHP übergeben? Mit Out-Parameter, also out_id:=v_id und out_bezeichnung:=v_bezeichnung?? Dann gibt er doch nur von einem Datensatz die beiden Paramater zurück, oder?
Oder muss ich das über einen Cursor lösen?
Datenbank ist eine Oracle XE.
Felix, dein Tipp ist mir bekannt ;) Also das grundsätzliche Vorgehen ist mir bewusst.
Das liest sich aber nicht ganz so, Christoph. ;)
Wo ist das Problem? Wie konnektierst Du per PHP die DB? Was sollen die Variablen? Was denkst Du Dir bei der Cursor-Frage? Wo genau hapert es? Bei der Oracle-Function?
aaalso:
Das Problem ist einfach, dass ich die Prozedur nicht hinbekomme. Wie bekomme ich es hin, dass alle Datensätze aus der Tabelle von der Prozedur ausgeworfen werden?
Und wie greife ich dann per OCI über PHP darauf zu?
so sieht meine prozedur zur zeit aus:
procedure s_status as
result status%rowtype;
begin
select * INTO result from status;
end;
INTO muss ich ja angeben. Wie gebe ich jetzt die Datensätze zurück? Mit out_result:=result; ?? Kann ich denn dann auch auf die einzelnen Spalten mit php zugreifen? Wenn ja, wie?
Das Problem ist einfach, dass ich die Prozedur nicht hinbekomme. Wie bekomme ich es hin, dass alle Datensätze aus der Tabelle von der Prozedur ausgeworfen werden?
Wir machen das unter T-SQL in etwa so "CREATE PROCEDURE <NAME> AS SELECT * FROM DT_1". In Oracle-SQL dürfte es ähnlich gehen.
Ein Blick in die Doku hilft, schreibe doch einfach dann unter Angabe des verwendetetn Codes was nicht funzt (incl. Fehlermeldung) nach vorhergehender Problemisolierung.
Und wie greife ich dann per OCI über PHP darauf zu?
so sieht meine prozedur zur zeit aus:
procedure s_status as
result status%rowtype;
begin
select * INTO result from status;
end;INTO muss ich ja angeben. Wie gebe ich jetzt die Datensätze zurück? Mit out_result:=result; ?? Kann ich denn dann auch auf die einzelnen Spalten mit php zugreifen? Wenn ja, wie?
Aha, Du gehst systematisch vor, sorry. ;)
Schreibe einfach mal die einfachstmögliche Prozedur. Was soll das INTO? Was soll die Parametrisierung?
das into ist drin, weil sonst ein kompilierungsfehler kommt. ohne into geht nicht!
mit into kommt folgende fehlermeldung:"ORA-01422: Exakter Abruf gibt mehr als die angeforderte Zeilenzahl zurück"
das kann doch nicht so schwer sein? hat einer noch einen konkreten hinweis?
das kann doch nicht so schwer sein? hat einer noch einen konkreten hinweis?
LOL - natürlich kan die Syntax so einiges abfordern (ist ja Oracle ;).
Die Fehlermeldung deutet darauf hin, dass der Ausgangsparameter ein Skalar ist, also keine Datensatzmenge aufnehmen kann. Ändere den Typ des Ausgangsparameters auf table (oder so ;).
Rück mal einen Webverweis auf die Oracle-Doku raus und welche Doku-Teile Du für relevant hältst.
Dann kann Dir vermutlich schnell geholfen werden...
Hallo,
Hi,
weiß jemand wie ich mit einer Prozedur oder Funktion alle Datensätze einer Tabelle abfragen kann und diese dann in PHP ausgeben lassen kann? Danke für die Hilfe!
Garnicht, siehe Rückgabe Datentyp (http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html)! Warum willst du auch alle Datensätze per function auslesen? Gäbe doch kein Vorteil ...
Gruß Chris
Gruß Jan
Du sollst ja auch nicht den/die Rückgabewerte von CREATE PROCEDURE auswerten sondern vom späteren EXECUTE [yourProcedure]
Eine gespeicherte Prozedur hat meistens den Vorteil, dass sie einen vorkompilierten Ausführungsplan für die Abfrage benutzt und damit unter gewöhnlichen Umständen schon schneller sein sollte als wild abgefeuerte einzelne Abfragen. Ausserdem ist es eine Frage der Abstraktion des Zugriffs.
Cheers,
Frank