DB2 Update trigger

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^
pboixAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

cubixSoftwareCommented:
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
srielauCommented:
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
sachinwadhwaCommented:
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
Introducing Cloud Class® training courses

Tech changes fast. You can learn faster. That’s why we’re bringing professional training courses to Experts Exchange. With a subscription, you can access all the Cloud Class® courses to expand your education, prep for certifications, and get top-notch instructions.

pboixAuthor Commented:
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
sachinwadhwaCommented:
how did u execute it?

copy all to a file and execute it using:

DB2 -td% -f <filename>
0
pboixAuthor Commented:
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
sachinwadhwaCommented:
instead of <> use !=

0
pboixAuthor Commented:
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
sachinwadhwaCommented:
try IF o.fiable = n.fiable then

without brackets !

0
pboixAuthor Commented:
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
srielauCommented:
Please post the actual error messages you get. You are withholding crucial information whenever you ommit it.
0
pboixAuthor Commented:
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
srielauCommented:
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

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
pboixAuthor Commented:
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
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
DB2

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.