?
Solved

DB2 Update trigger

Posted on 2006-03-21
14
Medium Priority
?
1,182 Views
Last Modified: 2008-03-06
I want to create a update trigger. Two tables are involved. The first is supplier and it has a column reliable that can be either 0 or 1. And the other one is the article table that has the columns
idSupplier, critical (0/1) and initialStatus (OK or QP quality pending).
The trigger I want to do is after updating the reliable column of suppliers if it is 0 update the articles of this supplier to initialStatus ='QP'. If it is 1 (reliable supplier) if the article is a critical one initial status must be set to QP and if not to OK.
I tried to write the trigger but I get sintax errors .





CONNECT TO FALCA;
CREATE TRIGGER DB2INST1.UPDTsupplier
AFTER  UPDATE OF reliable
ON RUMBO.TBLsupliers  
REFERENCING  OLD AS o  
NEW AS n  
FOR EACH ROW  MODE DB2SQL
WHEN ( o.reliable<>n.reliable)
BEGIN ATOMIC
if ( o.reliable=0 )  then
UPDATE RUMBO.TBLarticles ART
   SET initialstatus = 'QP'
   WHERE ART.idsupplier = n.idsupplier
else
UPDATE RUMBO.TBLarticles ART
   SET initialstatus= 'QP'
   WHERE ART.idsupplier = n.idsupplier
      and art.critical=0 ;
UPDATE RUMBO.TBLarticles ART
   SET initialstatus= 'OK'
   WHERE ART.idproveedor = n.idproveedor
      and art.critical=1
END^
CONNECT RESET^
0
Comment
Question by:pboix
  • 6
  • 4
  • 3
  • +1
14 Comments
 
LVL 6

Expert Comment

by:cubixSoftware
ID: 16246086
Sorry if this is a bit obvious, but is "AFTER  UPDATE OF reliable ON RUMBO.TBLsupliers" correct or should it be "AFTER  UPDATE OF reliable ON RUMBO.TBLsuppliers " ?

;)
0
 
LVL 2

Expert Comment

by:srielau
ID: 16246259
You are missing soem semicolons.
one befor ethe ELSE, the other before the END.
Also teh IF construct needs to be concluded with END IF;

So
BEGIN ATOMIC

IF
<stmt>; [<stmt> ;]
ELSE
<stmt>; [<stmt>;]
END IF;
END

Cheers
Serge
0
 
LVL 7

Expert Comment

by:sachinwadhwa
ID: 16246845
CONNECT TO FALCA%
CREATE TRIGGER DB2INST1.UPDTsupplier AFTER
UPDATE OF reliable
ON RUMBO.TBLsupliers
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN
      IF ( o.reliable <> n.reliable) THEN
            IF ( o.reliable = 0 ) THEN
                  UPDATE RUMBO.TBLarticles ART SET initialstatus = 'QP' WHERE   ART.idsupplier    = n.idsupplier
            ELSE
                  UPDATE RUMBO.TBLarticles ART SET initialstatus= 'QP' WHERE   ART.idsupplier   = n.idsupplier and art.critical = 0 ;
                  UPDATE RUMBO.TBLarticles ART SET initialstatus= 'OK' WHERE   ART.idproveedor  = n.idproveedor and art.critical = 1;
            END IF;
      END IF;
END%
CONNECT RESET%

0
Prepare for your VMware VCP6-DCV exam.

Josh Coen and Jason Langer have prepared the latest edition of VCP study guide. Both authors have been working in the IT field for more than a decade, and both hold VMware certifications. This 163-page guide covers all 10 of the exam blueprint sections.

 

Author Comment

by:pboix
ID: 16247777
Hi, the original sql sentence was written in spanish but I translated the table and columns name to be more easy to understand, so there are some little syntax errors but they are not the problem.
I have tried the script written by sachinwadhwa  but I get errors (sorry but some of the text is in spanish)
------------------------------ Mandatos entrados ------------------------------
CREATE TRIGGER DB2INST1.UPDTfiable AFTER
UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN
     IF ( o.fiable <> n.fiable) THEN
          IF ( n.fiable = 0 ) THEN
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado = 'PC' WHERE   ART.idproveedor    = ART.idproveedor
          ELSE
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'PC' WHERE   ART.idproveedor   = ART.idproveedor and art.articulocritico = 0 ;
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'OK' WHERE   ART.idproveedor  = n.idproveedor and art.articulocritico = 1;
          END IF;
     END IF;
------------------------------------------------------------------------------
CREATE TRIGGER DB2INST1.UPDTfiable AFTER
UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN
IF ( o.fiable <> n.fiable) THEN
IF ( n.fiable = 0 ) THEN
UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado = 'PC' WHERE   ART.idproveedor    = ART.idproveedor
ELSE
UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'PC' WHERE   ART.idproveedor   = ART.idproveedor and art.articulocritico = 0
DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0104N  Se ha encontrado una señal imprevista "<>" a continuación de " BEGIN
IF ( o.fiable".  Entre las señales esperadas se puede incluir: ",".  LINE
NUMBER=8.  SQLSTATE=42601

UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'OK' WHERE   ART.idproveedor  = n.idproveedor and art.articulocritico = 1
DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0206N  "N.IDPROVEEDOR" no es válida en el contexto en el que se utiliza.  
SQLSTATE=42703

END IF
DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0104N  Se ha encontrado una señal imprevista "END-OF-STATEMENT" a
continuación de "END IF".  Entre las señales esperadas se puede incluir: "JOIN
<joined_table>".  SQLSTATE=42601

END IF
DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0104N  Se ha encontrado una señal imprevista "END-OF-STATEMENT" a
continuación de "END IF".  Entre las señales esperadas se puede incluir: "JOIN
<joined_table>".  SQLSTATE=42601

SQL0104N  Se ha encontrado una señal imprevista "END-OF-STATEMENT" a continuación de "END IF".  Entre las señales esperadas se puede incluir: "JOIN <joined_table>                           ".

Explicación:

Se ha detectado un error de sintaxis en la sentencia de SQL en el
símbolo especificado después del texto "<texto>". El campo
"<texto>" indica los 20 caracteres de la sentencia de SQL que
preceden al símbolo que no es válido.  

 Como ayuda al programador, se proporciona una lista parcial de
símbolos válidos en el campo SQLERRM del SQLCA como
"<lista-símbolos>". Esta lista da por supuesto que la sentencia
es correcta hasta ese punto.  

 No se puede procesar la sentencia.  

Respuesta del usuario:

Revise y corrija la sentencia en el área del símbolo
especificado.  

 sqlcode :  -104

 sqlstate :  42601

0
 
LVL 7

Assisted Solution

by:sachinwadhwa
sachinwadhwa earned 600 total points
ID: 16247938
how did u execute it?

copy all to a file and execute it using:

DB2 -td% -f <filename>
0
 

Author Comment

by:pboix
ID: 16255011
Ok, I tried db2 -td% -f file and this is the message I get.


C:\Archivos de programa\IBM\SQLLIB\BIN>db2 -td% -f o:\docs\manuales\desarrolloap
licaciones\triggerupdt.txt

   Información de la conexión con la base de datos

 Servidor bases datos   = DB2/LINUX 8.2.4
 ID autorización SQL    = DB2INST1
 Alias base datos local = FALCASER


DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0104N  Se ha encontrado una señal imprevista "<>" a continuación de "EGIN
IF ( n.fiable".  Entre las señales esperadas se puede incluir: ",".  LINE
NUMBER=8.  SQLSTATE=42601

DB20000I  El mandato SQL ha finalizado satisfactoriamente.
0
 
LVL 7

Expert Comment

by:sachinwadhwa
ID: 16255663
instead of <> use !=

0
 

Author Comment

by:pboix
ID: 16278318
sachinwadhwa, I have tried to use != and I got the same error, then I tried to use = for the comparation and place the sentences in else
IF ( n.fiable = o.fiable) then
      ELSE.....
But I got the error. Then I tried to use == instead of =  but the same.

I think it is a syntax problem, this is the file and the error message:

CONNECT TO FALCASER user db2inst1 using db2inst1%
CREATE TRIGGER DB2INST1.UPDTfiable AFTER
UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN
      IF ( n.fiable = o.fiable) then
      ELSE
          IF ( n.fiable = 0 ) THEN
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado = 'PC' WHERE   ART.idproveedor    =

ART.idproveedor
          ELSE
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'PC' WHERE   ART.idproveedor   =

ART.idproveedor and art.articulocritico = 0 ;
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'OK' WHERE   ART.idproveedor  =

n.idproveedor and art.articulocritico = 1;
          END IF;
      END IF;
END%
CONNECT RESET%


C:\Archivos de programa\IBM\SQLLIB\BIN>db2 -td% -f o:\docs\manuales\desarrolloap
licaciones\triggerupdt.txt

   Información de la conexión con la base de datos

 Servidor bases datos   = DB2/LINUX 8.2.4
 ID autorización SQL    = DB2INST1
 Alias base datos local = FALCASER


DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0104N  Se ha encontrado una señal imprevista "=" a continuación de "EGIN
IF ( n.fiable".  Entre las señales esperadas se puede incluir: ",".  LINE
NUMBER=8.  SQLSTATE=42601

DB20000I  El mandato SQL ha finalizado satisfactoriamente.

0
 
LVL 7

Expert Comment

by:sachinwadhwa
ID: 16278532
try IF o.fiable = n.fiable then

without brackets !

0
 

Author Comment

by:pboix
ID: 16278866
Sorry sachinwadhwa simmilar error!!!  I'm now trying a easier trigger to find the bug.
CONNECT TO FALCASER user db2inst1 using db2inst1%
CREATE TRIGGER DB2INST1.UPDTfiable AFTER
UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN
      IF ( o.fiable = n.fiable ) then
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado = 'PC' WHERE   ART.idproveedor    = ART.idproveedor ;
        ELSE
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'PC' WHERE   ART.idproveedor   = ART.idproveedor and art.articulocritico = 0 ;

      END IF;
END%
CONNECT RESET%
0
 
LVL 2

Expert Comment

by:srielau
ID: 16279095
Please post the actual error messages you get. You are withholding crucial information whenever you ommit it.
0
 

Author Comment

by:pboix
ID: 16301214
the command file:

CONNECT TO FALCASER user db2inst1 using db2inst1%
CREATE TRIGGER DB2INST1.UPDTfiable AFTER
UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
MODE DB2SQL
BEGIN
      IF ( o.fiable = n.fiable ) then
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado = 'PC' WHERE   ART.idproveedor    = ART.idproveedor ;
        ELSE
               UPDATE RUMBO.TBLarticulos ART SET idarticuloEstado= 'PC' WHERE   ART.idproveedor   = ART.idproveedor and art.articulocritico = 0 ;

      END IF;
END%
CONNECT RESET%

 


C:\Archivos de programa\IBM\SQLLIB\BIN>db2 -td% -f "o:\docs\manuales\desarrolloA
plicaciones\triggerupdt.txt"

   Información de la conexión con la base de datos

 Servidor bases datos   = DB2/LINUX 8.2.4
 ID autorización SQL    = DB2INST1
 Alias base datos local = FALCASER


DB21034E  El mandato se ha procesado como una sentencia de SQL porque no era
un mandato válido para el procesador de línea de mandatos.  Durante el proceso
SQL se ha devuelto:
SQL0104N  Se ha encontrado una señal imprevista "=" a continuación de "EGIN
IF ( o.fiable".  Entre las señales esperadas se puede incluir: ",".  LINE
NUMBER=8.  SQLSTATE=42601

DB20000I  El mandato SQL ha finalizado satisfactoriamente.
0
 
LVL 2

Accepted Solution

by:
srielau earned 400 total points
ID: 16301357
BEGIN ATOMIC

Also you can have this a lot simpler:

CONNECT TO FALCASER user db2inst1 using db2inst1%

CREATE TRIGGER DB2INST1.UPDTfiable AFTER
UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
UPDATE RUMBO.TBLarticulos ART
   SET idarticuloEstado= 'PC'
   WHERE   ART.idproveedor  = ART.idproveedor
        and CASE WHEN o.fiable = n.fiable
                       THEN 0
                       ELSE art.articulocritico = 0 END
%
CONNECT RESET%
0
 

Author Comment

by:pboix
ID: 16380285
Ok, it's working. I have created two triggers :


CONNECT TO FALCASER user db2inst1 using db2inst1%
CREATE TRIGGER DB2INST1.UPDTfiable
AFTER UPDATE OF fiable
ON RUMBO.TBLproveedores
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
when (o.fiable<>n.fiable)
BEGIN atomic
          IF  n.fiable = 0  THEN
               UPDATE RUMBO.TBLarticulos SET idarticuloEstado = 'PC' WHERE  idproveedor = n.idproveedor;
          ELSE
               UPDATE RUMBO.TBLarticulos SET idarticuloEstado= 'PC' WHERE idproveedor   = n.idproveedor and articulocritico = 0 ;
               UPDATE RUMBO.TBLarticulos SET idarticuloEstado= 'OK' WHERE idproveedor  = n.idproveedor and articulocritico = 1;
          END IF;
END%
CONNECT RESET%


AND


CONNECT TO FALCASER user db2inst1 using db2inst1%
CREATE TRIGGER DB2INST1.UPDTArtIDestado
before UPDATE OF articulocritico, idproveedor
ON RUMBO.TBLarticulos
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
BEGIN atomic
          IF  n.articulocritico = 1  THEN
               set n.idarticuloEstado = 'PC' ;
          ELSE
            Set n.idarticuloestado =
               CASE
                  WHEN 0 = (Select p.fiable from rumbo.tblproveedores p
                        where p.idproveedor=n.idproveedor)
                     THEN 'OK'
                  ELSE 'PC'
               END;
         END if;      
END%
CONNECT RESET%

0

Featured Post

Upgrade your Question Security!

Add Premium security features to your question to ensure its privacy or anonymity. Learn more about your ability to control Question Security today.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

November 2009 Recently, a question came up in the DB2 forum regarding the date format in DB2 UDB for AS/400.  Apparently in UDB LUW (Linux/Unix/Windows), the date format is a system-wide setting, and is not controlled at the session level.  I'm n…
Recursive SQL in UDB/LUW (it really isn't that hard to do) Recursive SQL is most often used to convert columns to rows or rows to columns.  A previous article described the process of converting rows to columns.  This article will build off of th…
This video shows how to quickly and easily deploy an email signature for all users in Office 365 and prevent it from being added to replies and forwards. (the resulting signature is applied on the server level in Exchange Online) The email signat…
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
Suggested Courses

850 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question