Mon code ne fonctionne pas. PAS d'erreurs Exigence: Je souhaite créer un déclencheur (soit AVANT OU APRÈS INSERT) sur TABLE1 pour mettre à jour la colonne TABLE1.TABLETYPE=1 et mettre à jour les valeurs de balise XML TABLE1.E2B2 à 1 (/icstable/safetytable/tabletype)
REMARQUE : TABLE1.E2B2 est clob et stocke le fichier XML.
Il y a deux problèmes : 1) La clause "WHEN TRIGGER" NE FONCTIONNE PAS
2) Lorsque je supprime la clause When trigger , les mises à jour ne se produisent pas non plus.

Pour tous les enregistrements de la table1 où TABLE1.AGENCY_ID=12345 et TABLE1.TABLETYPE=2

CREATE OR REPLACE TRIGGER TRG_SAF_BEF_INS BEFORE
  INSERT ON TABLE1 REFERENCING NEW AS NEW OLD AS OLD  FOR EACH ROW 
  WHEN (NEW.AGENCY_ID  = 12345 AND NEW.TABLETYPE=2) 
  DECLARE 
  v_error_code         NUMBER;
  v_rep_id             NUMBER;
     
  BEGIN
           
   
   --Updating TABLE1.TABLETYPE  to 1    
          
      :NEW.TABLETYPE:=1;

    --updating the TABLE1.E2B2 Which is XML File stored in CLOB  
      select updatexml( xmltype.createxml(:NEW.E2B2),'/icstable/safetytable/tabletype/text()',1  ).getClobVal() 
      INTO :NEW.E2B2  FROM DUAL;
      
    
  EXCEPTION
  WHEN OTHERS THEN
    
     RAISE_APPLICATION_ERROR(-20004, 'ERROR');
  
END TRG_SAF_BEF_INS;

Créer une table est comme ceci :

create table table1 (agency_id number,tabletype number,e2b2 clob);      

The data looks below:     
**********************************************
||agency_id ||  tabletype ||    e2b2 ||                                                        
**********************************************
12345   2    "<icstable>
  <safetytable>
  <safetytableid>E3223</safetytableid> 
  <transmissiondater>20201007105128-0700</transmissiondater> 
  <tabletype>2</tabletype> 
  </icstable>
  </safetytable>"                
22332   4   "<icstable>
  <safetytable>
  <safetytableid>E5623</safetytableid> 
  <transmissiondater>20201007105128-0700</transmissiondater> 
  <tabletype>4</tabletype> 
  </icstable>
  </safetytable>"
45226   3   "<icstable>
  <safetytable>
  <safetytableid>E3823</safetytableid> 
  <transmissiondater>20201007105128-0700</transmissiondater> 
  <tabletype>3</tabletype> 
  </icstable>
  </safetytable>"
12345   2   "<icstable>
  <safetytable>
  <safetytableid>E3333</safetytableid> 
  <transmissiondater>20201007105128-0700</transmissiondater> 
  <tabletype>2</tabletype> 
  </icstable>
  </safetytable>"
12345   1   "<icstable>
  <safetytable>
  <safetytableid>E322w2</safetytableid> 
  <transmissiondater>20201007105128-0700</transmissiondater> 
  <tabletype>1</tabletype> 
  </icstable>
  </safetytable>"
                                                             
0
Pramod Kumar 7 oct. 2020 à 21:19

1 réponse

Meilleure réponse

Tableau et déclencheur :

SQL> create table table1 (tabletype number,e2b2 clob);

Table created.

SQL> create or replace trigger trg_test
  2    before insert on table1
  3    for each row
  4  begin
  5    select updatexml( xmltype.createxml(:new.E2B2),'/icstable/safetytable/tabletype/text()',1  ).getClobVal()
  6    into :new.e2b2
  7    from dual;
  8  end;
  9  /

Trigger created.

Essai:

SQL> insert into table1
  2  select 1,
  3  '<icstable>   <safetytable>     <safetytableid>E3823</safetytableid>     <transmissiondater>20201007105128-0700</transmissiondater>     <tabletype>2</tabletype>   </safetytable></icstable>'
  4  from dual;                                                                                                                             -- inserted 2

    1 row created.
    
SQL> select * from table1;

 TABLETYPE
----------
E2B2
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         1
<icstable><safetytable><safetytableid>E3823</safetytableid><transmissiondater>20201007105128-0700</transmissiondater><tabletype>1</tabletype></safetytable></icstable>
                                                                                                                  -- results in 1


SQL>

Si vous faites défiler vers la droite, vous verrez que

  • 2 faisait partie de la déclaration INSERT
  • le déclencheur l'a changé en 1
0
Littlefoot 7 oct. 2020 à 19:47