PostgreSQL "DECLARE variable" [erledigt]

Hier dreht es sich um den PostGre Server

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

PostgreSQL "DECLARE variable" [erledigt]

Beitrag von AUGE_OHR »

hi,

ich fragte mich was eine "Zeilenvariable", eine "Record-Variable" oder eine Liste einfacher "Variablen" sind unter PostgreSQL.

nun "denke" ich das man die erst einmal per "DECLARE" erzeugen muss.
DECLARE ziel;
FETCH cursor INTO ziel;
aber wie komme ich nun an die "Variable" mit dem Namen "ziel" ?

da es sich um eine PostgreSQL "variabel" handelt würde ich denken ich muss eine PostgreSQL "function" benutzen um da ran zu kommen ?

Code: Alles auswählen

CREATE FUNCTION meinZiel RETURNS SETOF ziel
Zuletzt geändert von AUGE_OHR am Fr, 03. Aug 2012 4:38, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
bgl
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 43
Registriert: Di, 30. Aug 2011 20:45

Re: PostgreSQL "DECLARE variable"

Beitrag von bgl »

FETCH INTO ist fuer den Einsatz innerhalb einer STORED FUNCTION gedacht. Die hat einen DECLARE-Bereich, in dem ihre Variablen deklariert werden.
Für normale Zwecke nimmst du einfach FETCH ohne INTO.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "DECLARE variable"

Beitrag von AUGE_OHR »

bgl hat geschrieben:FETCH INTO ist fuer den Einsatz innerhalb einer STORED FUNCTION gedacht. Die hat einen DECLARE-Bereich, in dem ihre Variablen deklariert werden.
Für normale Zwecke nimmst du einfach FETCH ohne INTO.
hm ... aber "wo" finde ich dann mein "Ergebniss" ?
ich meine damit das ich doch jedes mal

Code: Alles auswählen

   lret := ::oPG:exec(cSQL)
   oRes := ::oPG:result
verwenden muss um ein SQL Befehl abzusenden und das Result Set / Object dann weiter zu verwenden.

Code: Alles auswählen

cVar0 := "BEGIN WORK;"     
cVar1 := "DECLARE meinezeile "+STRTRAN(cTable," AS a","")+"%ROWTYPE;"
cVar2 := "DECLARE liahona CURSOR FOR SELECT * FROM "+STRTRAN(cTable," AS a","")+" ORDER BY "+cOrder+";"
cVar3 := "MOVE FORWARD "+cOffset+" IN liahona;"
cVar4 := "FETCH "+cLimit+" FROM liahona;"     // INTO meinezeile;"
cVar5 := "CLOSE liahona;"
cVar6 := "COMMIT WORK;"
jede Variabel steht für eine Zeile ich ich "absende".
ich bekomme aber keine ::oPG:result:rows ...
gruss by OHR
Jimmy
bgl
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 43
Registriert: Di, 30. Aug 2011 20:45

Re: PostgreSQL "DECLARE variable"

Beitrag von bgl »

AUGE_OHR hat geschrieben:ich bekomme aber keine ::oPG:result:rows ...
Aber in psql hat der Befehl funktioniert, richtig?

Ich würde vermuten, dass das gleiche passiert wie in pgadminIII - du kriegst das Ergebnis des letzten Befehls und der lautet eben "COMMIT WORK;" - du solltest also eventuell die Befehlsfolge aufteilen, zuerst vorbereiten (wenns sein muss kannst du bis incl. FETCH auch alles in einem Befehl packen), das ausfuehren, mit deinem Resultset Dinge tun (es irgendwo ablegen z.B.), dann den naechsten Befehl (CLOSE, COMMIT etc...).

Ich muss auch gestehen, dass ich nicht kapiere, warum du mit BEGIN/COMMIT arbeitest, wenn du doch gar keine Änderungen durchführst... ist das eine XBase++ basierte Gewohnheit oder nur damit du es nicht vergisst, wenn du mal tatsächlich Daten schreibst?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "DECLARE variable"

Beitrag von AUGE_OHR »

bgl hat geschrieben:
AUGE_OHR hat geschrieben:ich bekomme aber keine ::oPG:result:rows ...
Aber in psql hat der Befehl funktioniert, richtig?
JA
bgl hat geschrieben:Ich würde vermuten, dass das gleiche passiert wie in pgadminIII - du kriegst das Ergebnis des letzten Befehls und der lautet eben "COMMIT WORK;" - du solltest also eventuell die Befehlsfolge aufteilen, zuerst vorbereiten (wenns sein muss kannst du bis incl. FETCH auch alles in einem Befehl packen), das ausfuehren, mit deinem Resultset Dinge tun (es irgendwo ablegen z.B.), dann den naechsten Befehl (CLOSE, COMMIT etc...).
ich habe das deshalb in die Variabeln aufgeteilt. ich schicke jede "einzeln" ab und kontrolliere danach sofort das Result Set ... ::rows = 0
NO_FETCH.PNG
NO_FETCH.PNG (71.39 KiB) 8552 mal betrachtet
bgl hat geschrieben:Ich muss auch gestehen, dass ich nicht kapiere, warum du mit BEGIN/COMMIT arbeitest, wenn du doch gar keine Änderungen durchführst... ist das eine XBase++ basierte Gewohnheit oder nur damit du es nicht vergisst, wenn du mal tatsächlich Daten schreibst?
em, äh ... COPY/PASTE ... i´m a Newbiew ;)
d.h. die 1st. und letzte Zeile kann "weg" weil ich es nur was Anzeige (read-only)

p.s. weil am Anfang OFFSET = 0 wird cVar3 übersprungen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "DECLARE variable"

Beitrag von AUGE_OHR »

hi,

ich habe mich selbst wieder rein-gelegt ... ich habe vergessen das

Code: Alles auswählen

::oPG:exec(cSQL)
ja IMMER .T. zurück gibt ...
erst in der nächsten Zeile, die fehlte, wird "geprüft" was geantwortet wurde

Code: Alles auswählen

IF ResultStatus(::oPG, ::_oMainLoop )

FUNCTION ResultStatus( oConn, oMain )

LOCAL xt
LOCAL lRet := .T.

   xt := oConn:Result:ResultStatus()
   DO CASE
      CASE xT = PGRES_TUPLES_OK
      CASE xT = PGRES_COMMAND_OK
      OTHERWISE
         lRet := .F.
         oMain:OutMsg( "Error " + VAR2CHAR( oConn:errorMessage() ) + CRLF )
         // jetzt sehe ich se ...
         Msgbox( "Error " + VAR2CHAR( oConn:errorMessage() ) )
   ENDCASE

RETURN lRet
und nun bekomme ich auch eine Errormessage
DECLARE_CURSOR.PNG
DECLARE_CURSOR.PNG (6.05 KiB) 8550 mal betrachtet
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL "DECLARE variable"

Beitrag von AUGE_OHR »

bgl hat geschrieben:... warum du mit BEGIN/COMMIT arbeitest ...
ohne die 1st und letzte Zeile kam die Fehlermeldung.

aber nun der Witz ... ich bekomme jetzt ein Result Set
FETCH_22.PNG
FETCH_22.PNG (73.96 KiB) 8550 mal betrachtet
zumindest zeigt er mir bei ::rows > 0 was an.

Nachtrag : es klappt ;) weiteres im Thread "MOVE"
gruss by OHR
Jimmy
Antworten