25 avril 2022

Conditionner les ordres DDL Oracle créés par la RBF

Dans HR Access la chaine batch RBF produit des ordres DDL de création / mise à jour des tables du SGBD (fichier PSBBGJ00 PSBBGJ01 PSBBGJ02). Ceux-ci procèdent souvent d'un DROP suivi d'un CREATE.

Dans le cas ou l'objet n'existe pas encore, l'ordre de DROP va provoquer un erreur. Si on retire le DROP mais que l'objet existe, c'est le CREATE qui sera a l'origine d'une erreur. Quand on souhaite contrôler le bon déroulement des livraisons cela peut être gênant.

Oracle ne fournit pas de syntaxe spécifique, mais il est possible de coder en PL/SQL un conditionnement de l'ordre ou d'inhiber l'erreur. Un autre intérêt est de pouvoir relancer le script autant de fois que nécessaire quand on a rencontré un incident sur un des objets.

Script DDL d'origine :

DROP   TABLE       HR.ZYWK
          CASCADE CONSTRAINTS
;
COMMIT ;
CREATE TABLE       HR.ZYWK
        (      NUDOSS       NUMBER(38)                        NOT NULL ,
               NULIGN       NUMBER(38)                        NOT NULL ,
...
               TTJRF2       CHAR                    (0001)    NOT NULL ,
 CONSTRAINT FKZYWK
        FOREIGN KEY (NUDOSS       ) REFERENCES       HR.ZY00
              ON DELETE CASCADE )
            TABLESPACE HRZY
;
COMMIT ;
ALTER TABLE       HR.ZYWK
 ADD  CONSTRAINT X1ZYWK              UNIQUE
          (NUDOSS               ,
           NULIGN               )
            USING INDEX TABLESPACE HRZYI
;
COMMIT ;
CREATE            INDEX       HR.X2ZYWK        ON       HR.ZYWK
          (NUDOSS               ,
           ACCORD               ,
           DATDEB               )
                        TABLESPACE HRZYI
;
COMMIT ;

Exemple de script PL/SQL inhibant les erreurs en cas de présence de l'objet. Il faut adapter le SQLCODE au cas d'usage.
NB : L'ordre de création de la clef étrangère a été dissocié de l'ordre de création de la table.

declare

begin
execute immediate '
CREATE TABLE       HR.ZYWK
        (      NUDOSS       NUMBER(38)                        NOT NULL ,
               NULIGN       NUMBER(38)                        NOT NULL ,
...
               TTJRF2       CHAR                    (0001)    NOT NULL )
            TABLESPACE HRZY';
  exception when others then
  if SQLCODE = -955 then null; else raise; end if;
end;
/

begin
execute immediate '
ALTER TABLE       HR.ZYWK
 ADD CONSTRAINT FKZYWK FOREIGN KEY (NUDOSS       ) REFERENCES       HR.ZY00
              ON DELETE CASCADE';
  exception when others then
  if SQLCODE = -2275 then null; else raise; end if;
end;
/

begin
execute immediate '
ALTER TABLE       HR.ZYWK
 ADD  CONSTRAINT X1ZYWK              UNIQUE
          (NUDOSS               ,
           NULIGN               )
            USING INDEX TABLESPACE HRZYI';
  exception when others then
  if SQLCODE = -2261 then null; else raise; end if;
end;
/

begin
execute immediate '
CREATE            INDEX       HR.X2ZYWK        ON       HR.ZYWK
          (NUDOSS               ,
           ACCORD               ,
           DATDEB               )
                        TABLESPACE HRZYI';
  exception when others then
  if SQLCODE = -955 then null; else raise; end if;
end;
/

Exemple de script PL/SQL conditionnant les créations a l'absence de l'objet. Il faut adapter le SELECT COUNT au cas d'usage.

declare nb number;
begin
    SELECT COUNT(*) INTO nb FROM user_tables WHERE table_name = 'ZYWK';
    if(nb <= 0)
        then
        execute immediate '
CREATE TABLE       HR.ZYWK
        (      NUDOSS       NUMBER(38)                        NOT NULL ,
               NULIGN       NUMBER(38)                        NOT NULL ,
 ...
               TTJRF2       CHAR                    (0001)    NOT NULL )
            TABLESPACE HRZY';
    end if;
end;
/

declare nb number;
begin
    SELECT COUNT(*) INTO nb FROM user_constraints WHERE constraint_name = 'FKZYWK' ;
    if(nb <= 0)
        then
        execute immediate '
ALTER TABLE       HR.ZYWK
 ADD CONSTRAINT FKZYWK FOREIGN KEY (NUDOSS       ) REFERENCES       HR.ZY00
              ON DELETE CASCADE';
    end if;
end;
/

declare nb number;
begin
    SELECT COUNT(*) INTO nb FROM user_constraints WHERE constraint_name = 'X1ZYWK';
    if(nb <= 0)
        then
        execute immediate '
ALTER TABLE       HR.ZYWK
 ADD  CONSTRAINT X1ZYWK              UNIQUE
          (NUDOSS               ,
           NULIGN               )
            USING INDEX TABLESPACE HRZYI';
    end if;
end;
/

declare nb number;
begin
    SELECT COUNT(*) INTO nb FROM user_indexes WHERE index_name = 'X2ZYWK' ;
    if(nb <= 0)
        then
        execute immediate '
CREATE            INDEX       HR.X2ZYWK        ON       HR.ZYWK
          (NUDOSS               ,
           ACCORD               ,
           DATDEB               )
                        TABLESPACE HRZYI';
    end if;
end;
/

Aucun commentaire:

Enregistrer un commentaire