PostgreSQL "DECLARE variable" [erledigt]

Alles zum PostgreSQL-Server

Moderator: Moderatoren

PostgreSQL "DECLARE variable" [erledigt]

Beitragvon AUGE_OHR » Do, 02. Aug 2012 5:31

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 3:38, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10149
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL "DECLARE variable"

Beitragvon bgl » Do, 02. Aug 2012 8:50

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.
bgl
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 43
Registriert: Di, 30. Aug 2011 19:45

Re: PostgreSQL "DECLARE variable"

Beitragvon AUGE_OHR » Do, 02. Aug 2012 22:20

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10149
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL "DECLARE variable"

Beitragvon bgl » Do, 02. Aug 2012 22:25

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?
bgl
Cut&Paste-Entwickler
Cut&Paste-Entwickler
 
Beiträge: 43
Registriert: Di, 30. Aug 2011 19:45

Re: PostgreSQL "DECLARE variable"

Beitragvon AUGE_OHR » Do, 02. Aug 2012 23:11

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) 2128-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: 10149
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL "DECLARE variable"

Beitragvon AUGE_OHR » Do, 02. Aug 2012 23:32

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) 2126-mal betrachtet
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10149
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL "DECLARE variable"

Beitragvon AUGE_OHR » Do, 02. Aug 2012 23:51

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) 2126-mal betrachtet
zumindest zeigt er mir bei ::rows > 0 was an.

Nachtrag : es klappt ;) weiteres im Thread "MOVE"
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10149
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg


Zurück zu SQL-Server

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron