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