SELECT an sp übergeben und resultset zurückbekommen

Probleme und Fragen zum Thema Trigger und Funktionen.

SELECT an sp übergeben und resultset zurückbekommen

Beitragvon D.A.U. » Di 10. Jul 2012, 17:03

Hallo liebe PG-Gemeinde,

ich bin neu in Postgres und Stored Procedures im Allgemeinen.

Ich suche eine Stored Procedure, der ich ein SELECT-Statement übergeben kann und ein Resultset zurückerhalte.

Der Grund ist, dass wir demnächst alles über Webservices machen und ich aus meinem Delphi PRojekt nicht mehr direkt auf die DB zugreifen kann.
Dort habe ich ein Modul , dass für mich die Datensteuerung übernimmt und mein SELECT ausführt. Derzeit mit direkter Datenbankverbindung.

Pseudocode:

Code: Alles auswählen
CREATE FUNCTION sp_SELECT(statement character varying) RETURN Recordset
DECLARE
  rs Recordset;
BEGIN
  SELECT statement into rs;
  RETURN rs;
END;


Kann mir jemand sagen wie das ohne Pseudo aussieht?
D.A.U.
Neuer Benutzer
 
Beiträge: 5
Registriert: Di 10. Jul 2012, 16:57

Beitragvon akretschmer » Di 10. Jul 2012, 17:08

D.A.U. hat geschrieben:
Kann mir jemand sagen wie das ohne Pseudo aussieht?


Ja, da steht dann EXECUTE drin, schau in die Doku PostgreSQL: Documentation: 9.1: Basic Statements

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon D.A.U. » Di 10. Jul 2012, 17:20

Danke :)

Ich habe jetzt das hier zusammengeschwurbelt:

Code: Alles auswählen
CREATE OR REPLACE FUNCTION sp_select(statement character varying)
   RETURNS refcursor AS
 $BODY$
 DECLARE
   ref refcursor;
 BEGIN
   EXECUTE statement into ref;
   RETURN ref;
 END;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;
 ALTER FUNCTION sp_select(character varying)
   OWNER TO postgres;


Fehler hat er schon mal keine mehr ausgegeben, allerdings kommt bei einem
Code: Alles auswählen
SELECT * FROM sp_select('SELECT * FROM tbl_test')

als Ergebnis nur "2" raus. Also keine wirklichen Daten.

Ich möchte es nicht vorgekaut fertigprogrammiert verlangen (würde mich aber nicht wehren wenn es denn jemand machen mag ;) ), aber ein Link wo ich etwas finde wäre gut.

Bisher habe ich nur die 2 Optionen gefunden:
Mit refcursor : dann kommt das von eben raus
Mit SetOf Object : dann kann ich die SP aber nicht mehr für beliebige tabellen verwenden oder?

Grüße

Edith hat noch mal gegooglet und noch statt
Code: Alles auswählen
RETURN ref

das hier gefunden:
Code: Alles auswählen
RETURN NEXT ref;
RETURN

allerdings bekomme ich dann den Fehler "RETURN NEXT kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden.
D.A.U.
Neuer Benutzer
 
Beiträge: 5
Registriert: Di 10. Jul 2012, 16:57

Beitragvon ads » Di 10. Jul 2012, 17:41

Moment mal, du übergibst ein Query einer Stored Procedure, diese führt das dann aus und gibt das Ergebnis zurück?
Ist das nicht das gleiche als ob du das direkt ausführst?
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon D.A.U. » Di 10. Jul 2012, 17:46

Jain. Der Unterschied ist, dass ich einem User die Berechtigung geben kann nur eine SP auszuführen. Wenn ich diese SP später mal bearbeite kann ich alles an einer Stelle ( der SP ) ändern. SQL Injection. Rückgabe von leeren Resultsets etc.

Edit:

Das mit den Webservices vorhin war unglücklich ausgedrückt. Alles ein wenig stressig derzeit und hab Unsinn erzählt.

Die DB liegt auf einem rootserver. Die DB soll ins internet abgeschottet sein.
Das heißt in zukunft soll alles über Webservices laufen.
Ich arbeite mit Delphi.
Derzeit: Delphi greift direkt auf DB zu.
Demnächst: Delphi greift auf Webservice zu. Webservice greift auf DB zu.

Nun arbeite ich derzeit allerdings direkt mit Recordsets in Delphi. Ein Webservice kann mir aber nur rudimentäre Datentypen zurückgeben. Das höchste der Gefühle sind Arrays von Basisdatentypen.
Um meine Zugriffsstruktur aber nicht sofort ändern zu müssen, da ich dafür grade keine Zeit habe, will ich wenigstens die DB Zugriffe mit SPs verschleiern.

Daher brauche ich quasi 4 SPs. Am besten heute noch umgesetzt :)
sp_Select(Inputstatement) : Resultset;
sp_Insert(Inputstatement) : Insert_id;
sp_Update(Inputstatement) : Void;
sp_Delete(Inputstatement) : Void;

Sollte klar sein, was die jeweils machen.

Ich finde nichts. Mir fehlt mein @@IDENTITY aus Mysql, weil Currval() mit der benannten Sequence arbeitet. also muss ich die immer mit übergeben.
Hab ich im Inputstatement nen string stehen, dann lässt sich grade nichts escapen. ich bin frustriert ...
D.A.U.
Neuer Benutzer
 
Beiträge: 5
Registriert: Di 10. Jul 2012, 16:57

Beitragvon ads » Di 10. Jul 2012, 19:43

D.A.U. hat geschrieben:sp_Select(Inputstatement) : Resultset;
sp_Insert(Inputstatement) : Insert_id;
sp_Update(Inputstatement) : Void;
sp_Delete(Inputstatement) : Void;


Ich lass dich mal den Bart Simpson machen: "Bitte schreibe 100 mal folgendes auf: Stored Procedures helfen *nicht* gegen SQL Injections!"
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon castorp » Di 10. Jul 2012, 19:56

D.A.U. hat geschrieben:Mir fehlt mein @@IDENTITY aus Mysql, weil Currval() mit der benannten Sequence arbeitet. also muss ich die immer mit übergeben.
Schon mal die Doku gelesen?
The fine manual hat geschrieben:lastval() Return value most recently obtained with nextval for any sequence
Von hier kopiert:
PostgreSQL: Documentation: 9.1: Sequence Manipulation Functions
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
castorp
Erfahrener Benutzer
 
Beiträge: 673
Registriert: Sa 27. Jun 2009, 22:24

Beitragvon D.A.U. » Di 10. Jul 2012, 20:01

Schreib doch lieber
"Wenn ich diese SP später mal bearbeite kann ich alles an einer Stelle ( der SP ) ändern." an irgendwelche Wände :)
Ein einfacher Link wär wirklich nett. Aber ich suche mir dann wohl lieber ein englischsprachiges Forum. Beim Umschauen in den anderen Topics habe ich gesehen, was für ein Ton hier herrscht. Alle nicht ganz so einsteigerfreundlich hier.
Schade. Bis denn dann.

PS: Nicht jeder, der in euren Augen simple Fragen stellt war zu faul um Google zu bemühen. Den meisten fehlen einfach die richtigen Suchbegriffe. Aber lmgtfy mit "wirklich+nutzloser+suchbegriff" scheint hier ja Gang und Gäbe zu sein.

Edit:
Danke castorp :)
D.A.U.
Neuer Benutzer
 
Beiträge: 5
Registriert: Di 10. Jul 2012, 16:57

Beitragvon ads » Di 10. Jul 2012, 20:03

Wenn du auf Englisch deine Anforderungen besser formulieren kannst - nur zu.
Bisher kommst du mit wichtigen Details nur spärlich um die Ecke.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon D.A.U. » Di 10. Jul 2012, 20:08

Bisher kommst du mit wichtigen Details nur spärlich um die Ecke.

Danke sehr :) Siehst du? Das war mir nicht bewusst.
Was also sollte ich euch noch mitteilen?
D.A.U.
Neuer Benutzer
 
Beiträge: 5
Registriert: Di 10. Jul 2012, 16:57

Nächste

Zurück zu Trigger und Funktionen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste