Anmelden

View Full Version : SQL .. for update of (RPG embedded SQL)



loeweadolf
31-05-06, 22:08
Hallo,

ich habe folgende SQL-Anweisungen im RPG definiert:



c/exec sql
c+ declare C_lagbes_02 cursor for
c+ select lapart, larega
c+ from lagbespf
c+ where lapart > 0
c+ and lafirm = :bifirm
c+ and lavgre02 = 'X'
c+ and larega > '000000'
c+ and larega < '999999'
c+ order by larega, lapart
c+ for update of larega, lavgre02
c/end-exec
c/exec sql
c+ open c_lagbes_02
c/end-exec


und



c/exec sql
c+ fetch C_lagbes_02 into
c+ :lapart,
c+ :larega
c/end-exec


und



c/exec sql
c+ update lagbespf
c+ set larega = :Rang,
c+ lavgre02 = ' '
c+ where current of c_lagbes_02
c/end-exec



In der Declare-Anweisung habe ich eine Sortierung (order by larega, lapart) angegeben und gleichzeitig ein Update for larega etc.
Das wird angemeckert.

Kann ein For Update nicht für ein ORDR BY - Feld verwendet werden ?

( Würde hier bzgl. Sortierung keine Probleme geben, da gleichzeitig ein Ausschlußkennzeichen mit ausgegeben wird. )

mfg.
Ludger

Fuerchau
01-06-06, 09:28
Tja, leider ist das so:

Positioned UPDATE statements identifying the cursor associated with a select-statement can update all
updateable columns, if:
* The select-statement does not contain one of the following:
– An UPDATE clause
– A FOR READ ONLY clause
– An ORDER BY clause
* The DECLARE CURSOR statement does not contain a SCROLL keyword without the DYNAMIC
keyword.

Da SQL ggf. bei Order-By die Daten in eine temporäre Ergebnistabelle kopiert, geht der Bezug zum Original verloren.

In solchen Fällen sollte ein Update-Where verwendet werden, was im Übrigen nicht langsamer ist, wenn für die Where-Klausel ein eindeutiger Index vorhanden ist.

loeweadolf
01-06-06, 09:43
Danke für die Antwort.

Ich habs mir beinahe gedacht.

Dann werde ich den Update mit einem "normalen SQL-Update" vornehmen.

mfg. Ludger