Seite 1 von 1

PostgreSQL "DECLARE variable" [erledigt]

Verfasst: Do, 02. Aug 2012 6:31
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

Re: PostgreSQL "DECLARE variable"

Verfasst: Do, 02. Aug 2012 9:50
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.

Re: PostgreSQL "DECLARE variable"

Verfasst: Do, 02. Aug 2012 23:20
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 ...

Re: PostgreSQL "DECLARE variable"

Verfasst: Do, 02. Aug 2012 23:25
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?

Re: PostgreSQL "DECLARE variable"

Verfasst: Fr, 03. Aug 2012 0:11
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) 8578 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

Re: PostgreSQL "DECLARE variable"

Verfasst: Fr, 03. Aug 2012 0:32
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) 8576 mal betrachtet

Re: PostgreSQL "DECLARE variable"

Verfasst: Fr, 03. Aug 2012 0:51
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) 8576 mal betrachtet
zumindest zeigt er mir bei ::rows > 0 was an.

Nachtrag : es klappt ;) weiteres im Thread "MOVE"