Toon posts:

[Oracle] PL/SQL

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik ben bezig met het schrijven van een beperking binnen Oracle. Dit gaat doormiddel van triggers en procedures.

Binnen een tabel met een eigen PK en FK hebben we 3 kolommen die uniek moeten zijn (een UK werkt hier niet ivm de PK) dit moet dus iets anders.

Gemaakt:
-een procedure met globale cursor die er voor zorgt dat de tabel in het geheugen komt omdat deze tijdens het wijzigen / invoeren niet gelezen mag worden.
- een statement trigger om de cursor te openen
- een rowtrigger voor het uitvoeren van de procedure die op de unieke waarden checked.

De triggers werken prima (althans ze worden goed aangemaakt) wel is het zo dat tijdens het uitvoeren van een update (update tabel set serie=1;) de hele database vast slaat. Weet iemand hoe ik deze combinatie anders zou moeten aanmaken?

Thx
Wzard
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
create or replace package p_u55
as

  procedure openen;
  
  procedure checken
  (p inschrijving.programma%type, s inschrijving.serie%type, b inschrijving.baan%type);
  
  
end p_u55;
/

create or replace package body p_u55
as

  cursor c_u55 is
  select programma,serie,baan from inschrijving;
  
  g_p inschrijving.programma%type;
  g_s inschrijving.serie%type;
  g_b inschrijving.baan%type;
  
procedure openen is
  begin
    if c_u55%isopen then close c_u55;
    end if;
    open c_u55;
  end openen;


procedure checken (p inschrijving.programma%type, s inschrijving.serie%type, b inschrijving.baan%type)
is
  begin
  
  fetch c_u55 into g_p,g_s,g_b;
  while c_u55%found loop
  
    if (p = g_p and s = g_s and b = g_b) then
    raise_application_error(-20000,'Deze baan wordt in deze serie binnen dit programma al gebruikt.')  ;
    end if;
    
  end loop;
  
  end checken;

begin
  dbms_output.put_line('test');
end p_u55;
/

/*************** Rowtrigger ***********************

create or replace trigger t_u55
before insert or update on inschrijving for each row


begin
  p_u55.checken(:new.programma , :new.serie , :new.baan);
end t_u55;
/

/**************** Statement trigger ***************

create or replace trigger t_u55st
before insert or update on inschrijving

begin
  p_u55.openen;
end t_u55st;
/

  • McMad
  • Registratie: Juli 2000
  • Laatst online: 18-08 11:26
Op woensdag 19 juni 2002 15:17 schreef wzard (oa) het volgende:
(een UK werkt hier niet ivm de PK)
Hoezo niet?

He's mad, he's mad, he's madder then mad Jack McMad, winner of last years madman competition.


  • McMad
  • Registratie: Juli 2000
  • Laatst online: 18-08 11:26
En overigens werkt je trigger niet vanwege een endless loop :P. Zoek de fout en kleur de plaatjes.

He's mad, he's mad, he's madder then mad Jack McMad, winner of last years madman competition.