[PLSQL] Cursor gebruiken om conditioneel velden te bekijken

Pagina: 1
Acties:

  • Wilfred
  • Registratie: Januari 2000
  • Laatst online: 22-08-2022
Ik ben bezig een veld in een tabel te wijzigen in een waarde uit diezelfde tabel.
Er zijn 3 velden waarvan veld_1 de vastgestelde waarde is (niet altijd gevuld) en veld_2 de opgezochte geschatte waarde (Wel altijd gevuld).
Wanneer veld_1 gevuld is moet veld_3 worden gevuld met de waarde uit veld_1 en wanneer veld_1 leeg is met de waarde uit veld_2.

In VBA maak ik dan een recordset van de tabel en laat hem er doorheen lopen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function Vullen()

dim rs as recordset

set rs = currentdb.openrecordset("tabelnaam")

rs.movefirst
do untill rs.eof = true

if rs.fields("veld_1") is not null then
    rs.Edit
    rs.Fields("veld_3") = rs.Fields("veld_1")
    rs.MoveNext
Else
    rs.Edit
    rs.Fields("veld_3") = rs.Fields("veld_2")
    rs.MoveNext
End If

Loop

end Function


In PLSQL heb je geloof ik de mogelijkheid om een cursor te maken.
Alleen kan ik niet vinden hoe je die cursor dan moet wijzigen omdat het volgens mij iets anders is dan de recordset. Is er wel een mogelijkheid om dit in PLSQL uit te voeren?

Sign of my Time


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
SQL:
1
Update tabelnaam set veld_3 = isnull(veld_1, veld_2)

:?
Of kent PLSQL geen IsNull? In dat geval misschien zoiets:
SQL:
1
2
3
Update tabelnaam set veld_3 = (If veld_1 is null then veld_2 else veld_1 end if))
of...
Update tabelnaam set veld_3 = Case When veld_1 is null then veld_2 else veld_1 end

[ Voor 63% gewijzigd door RobIII op 21-09-2006 14:19 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Het is Oracle, dan zou het NVL in plaats van ISNULL moeten zijn.

Overigens denk ik dat het goed is dat TS een cursusje SQL gaat volgen, je probeert te veel je procedurele denkwijze van het VBA programmeren toe te passen op je SQL scripts.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
P_de_B schreef op donderdag 21 september 2006 @ 14:20:
Het is Oracle, dan zou het NVL in plaats van ISNULL moeten zijn.

Overigens denk ik dat het goed is dat TS een cursusje SQL gaat volgen, je probeert te veel je procedurele denkwijze van het VBA programmeren toe te passen op je SQL scripts.
Ah... weer wat geleerd :D
SQL:
1
Update tabelnaam set veld_3 = NVL(veld_1, veld_2)

Dat zou dus moeten werken?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
:Y

Of COALESCE gebruiken, doet hetzelfde en werkt onder de meeste SQL dialecten.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Wilfred
  • Registratie: Januari 2000
  • Laatst online: 22-08-2022
RobIII schreef op donderdag 21 september 2006 @ 14:23:
[...]

Ah... weer wat geleerd :D
SQL:
1
Update tabelnaam set veld_3 = NVL(veld_1, veld_2)

Dat zou dus moeten werken?
Ik heb een heel klein beetje gelogen..

Veld_2 is ook wel eens leeg.. Dan is voor een bepaalde code nog geen prijs bekend.
Dit gaat dan niet werken neem ik aan.

edit:

code:
1
Update tabelnaam set veld_3 = (If veld_1 is null then veld_2 else veld_1 end if)

is denk ik de oplossing.. Ga ff testen.

[ Voor 14% gewijzigd door NMe op 21-09-2006 15:39 ]

Sign of my Time


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wilfred schreef op donderdag 21 september 2006 @ 14:31:
[...]


Ik heb een heel klein beetje gelogen..

Veld_2 is ook wel eens leeg.. Dan is voor een bepaalde code nog geen prijs bekend.
Dit gaat dan niet werken neem ik aan.
Tuurlijk wel, beetje slim mee spelen:
SQL:
1
Update tabelnaam set veld_3 = NVL(NVL(veld_1, veld_2),0)

In dit geval valt 'ie terug op z'n "default" waarde; 0
Of je gebruikt, zoals P_de_B zegt "COALESCE":
SQL:
1
Update tabelnaam set veld_3 = COALESCE(veld_1, veld_2, 0)

Waarbij wederom 0 de default is als beide (veld 1 en 2) NULL zijn.

[ Voor 21% gewijzigd door RobIII op 21-09-2006 14:36 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Wilfred
  • Registratie: Januari 2000
  • Laatst online: 22-08-2022
RobIII schreef op donderdag 21 september 2006 @ 14:32:
[...]

Tuurlijk wel, beetje slim mee spelen:
SQL:
1
Update tabelnaam set veld_3 = NVL(NVL(veld_1, veld_2),0)

In dit geval valt 'ie terug op z'n "default" waarde; 0
Ik heb de coalesce gebruikt.. Prima oplossing.
Dank voor de SQL training.. Ik zal morgen de cursus reserveren. :+

[ Voor 17% gewijzigd door Wilfred op 21-09-2006 14:41 ]

Sign of my Time

Pagina: 1