Comment enregistrer des formulaires dans la base de données ?
OBJECTIF
L'objectif de cette note est d'expliquer comment enregistrer des formulaires dans la base de données.
Elle indique ce que vous devez faire pour pouvoir enregistrer le
formulaire dans la base de données. (Cela s'appliquait à Developer 6i, mais n'est plus possible depuis Forms 9.x)
Remarque : il n'est pas recommandé de stocker les modules dans la base de données. Cette fonctionnalité
pourrait être retirée dans de futures versions.
COMMENT ENREGISTRER LE FORMULAIRE DANS LA BASE DE DONNÉES ?
Par défaut, un formulaire est généralement enregistré dans le système de fichiers.
Toutefois, si vous voulez l'enregistrer dans la base de données, vous devrez effectuer quelques
opérations dans la base de données : vous devrez y exécuter des scripts. Ces
scripts sont généralement installés lorsque vous installez la "database table" à partir du
CD. (Sans ces tables, vous obtenez l'erreur ORA-942 Table not exist)
Voici, étape par étape, ce que vous devez faire, en commençant par l'installation
du script :
1) Installez Database table à partir du CD Developer. Les scripts suivants
seront alors installés :
-- frm60bld.sql
-- frm60drp.sql
-- frm60grt.sql
-- frm60rvk.sql
Ces scripts se trouvent dans le répertoire suivant :
$oracle_home$\tools\dbtab60\forms60\
Le script frm60bld.sql crée les objets suivants :
-- table FRM50__OBJECT
-- index ifrm50_object sur frm50__object
-- synonyme public FRM50_OBJECT pour system.FRM50__OBJECT
-- table FRM50__BUFFER
-- index ifrm50_buffer sur frm50__buffer
-- synonyme public FRM50_BUFFER pour system.FRM50__BUFFER
-- table FRM50__BINDVAR
-- index ifrm50_bindvar sur frm50__bindvar
-- synonyme public FRM50_BINDVAR pour system.FRM50__BINDVAR
-- table FRM50__GRP
-- index unique iFRM50_grp sur FRM50__grp
-- synonyme public FRM50_GRP pour system.FRM50
__GRP
-- vue FRM50_ENABLED_ROLES
-- synonyme public FRM50_ENABLED_ROLES pour system.FRM50_ENABLED_ROLES
-- rôle ORAFORMS$OSC
-- rôle ORAFORMS$DBG
-- rôle ORAFORMS$BGM
Voici une copie du script, au cas où vous en auriez besoin.
create table FRM50__OBJECT
(
OWNER VARCHAR2(32),
MODID NUMBER(9),
ITEMID NUMBER,
NAME VARCHAR2(32),
OBJECTTYPE NUMBER,
SEQUENCE NUMBER,
RAWLEN NUMBER,
TEXTLEN NUMBER,
CHUNKNO NUMBER,
SCOPEID NUMBER,
SCOPE1 VARCHAR2(32),
SCOPE2 VARCHAR2(32),
SCOPE3 VARCHAR2(32),
RAWDATA RAW(250),
TEXTDATA1 VARCHAR2(2000),
TEXTDATA2 VARCHAR2(2000),
TEXTDATA3 VARCHAR2(2000),
TEXTDATA4 VARCHAR2(2000),
PROGRAMUNITID NUMBER
);
create index ifrm50_object on frm50__object(modid,itemid);
create public synonym FRM50_OBJECT for system.FRM50__OBJECT;
create table FRM50__BUFFER
(
OWNER VARCHAR2(32),
MODID NUMBER(9),
STARTADDR NUMBER,
STARTREF NUMBER,
DATATYPE NUMBER,
LONGID NUMBER
);
create index ifrm50_buffer on frm50__buffer(modid);
create public synonym FRM50_BUFFER for system.FRM50__BUFFER;
create table FRM50__BINDVAR
(
OWNER VARCHAR2(32),
MODID NUMBER(9),
ITEMID NUMBER,
NEXTBPOS NUMBER,
PLSQLBV_EP NUMBER,
TOTAL_BINDVAR NUMBER
);
create index ifrm50_bindvar on frm50__bindvar(modid, itemid);
create public synonym FRM50_BINDVAR for system.FRM50__BINDVAR;
create table FRM50__GRP
(
OWNER VARCHAR(30),
MODID DECIMAL(9),
ITEMID DECIMAL(9),
GRPNAME VARCHAR(30),
GRPFLAG NUMBER
);
create unique index iFRM50_grp on FRM50__grp(modid,itemid);
create public synonym FRM50_GRP for system.FRM50__GRP;
create or replace view FRM50_ENABLED_ROLES as
select urp.granted_role role,
sum(distinct decode(rrp.granted_role,
'ORAFORMS$OSC',2,
'ORAFORMS$BGM',4,
'ORAFORMS$DBG',1,0)) flag
from sys.user_role_privs urp, role_role_privs rrp
where urp.granted_role = rrp.role (+)
and urp.granted_role not like 'ORAFORMS$%'
group by urp.granted_role;
create public synonym FRM50_ENABLED_ROLES for system.FRM50_ENABLED_ROLES;
create role ORAFORMS$OSC;
create role ORAFORMS$DBG;
create role ORAFORMS$BGM;
Le script frm60drp.sql supprime les objets comme suit :
drop table FRM50__OBJECT;
drop table FRM50__BUFFER;
drop table FRM50__BINDVAR;
drop table FRM50__GRP;
drop view FRM50_ENABLED_ROLES;
drop public synonym FRM50_OBJECT;
drop public synonym FRM50_BUFFER;
drop public synonym FRM50_BINDVAR;
drop public synonym FRM50_GRP;
drop public synonym FRM50_ENABLED_ROLES;
drop role ORAFORMS$OSC;
drop role ORAFORMS$DBG;
drop role ORAFORMS$BGM;
Le script frm60grt.sql accorde les privilèges select, insert, delete et update sur les
objets créés précédemment, comme suit :
accept uname char prompt 'Grant access to user: ';
set verify off;
grant select, insert, delete, update on FRM50_OBJECT to &uname;
grant select, insert, delete, update on FRM50_BUFFER to &uname;
grant select, insert, delete, update on FRM50_BINDVAR to &uname;
grant select, insert, delete, update on FRM50_GRP to &uname;
grant select on FRM50_ENABLED_ROLES to &uname;
le script frm60rvk.sql révoque ces privilèges comme suit :
accept uname char prompt 'Revoke access from user: ';
set verify off;
revoke all on FRM50_OBJECT from &uname;
revoke all on FRM50_BUFFER from &uname;
revoke all on FRM50_BINDVAR from &uname;
revoke all on FRM50_GRP from &uname;
revoke all on FRM50_ENABLED_ROLES from &uname;
REMARQUE : si vous ne voulez pas installer les tables de base de données, vous pouvez copier et coller
les scripts ci-dessus dans le Bloc-notes et les enregistrer dans un fichier .sql.
2) Connectez-vous à la base de données en tant que system et exécutez le script frm60bld.sql pour créer
les objets mentionnés ci-dessus.
3) Une fois le script exécuté, vous pouvez lancer Forms Builder et
définir l'accès sur la base de données plutôt que sur les fichiers. Pour cela, vous
devez procéder comme suit :
a. Ouvrez le menu Tools de Forms Builder
b. Allez dans Preferences
c. Allez dans l'onglet Access
d. Cochez la case Database.
Une fois l'accès défini sur la base de données, lorsque vous enregistrez le formulaire avec "Save As", vous
êtes invité à l'enregistrer dans la base de données. Vous pouvez désormais l'enregistrer dans la base de données
sans problème. Vous n'auriez pas pu enregistrer le formulaire dans la
base de données sans exécuter d'abord le script mentionné ci-dessus.
REMARQUE : assurez-vous de n'obtenir aucune erreur lorsque vous exécutez le script frm60bld.sql.
Si vous rencontrez des erreurs, vérifiez que ces objets n'existent pas déjà dans
la base de données.