Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Depuis Access, créer un enregistrement Oracle et connaître la clef

2 réponses
Avatar
Gloops
Bonjour tout le monde,

Je cherche =E0 savoir quelle est la meilleure solution, en d=E9veloppant =
un=20
frontal Ms-Access 2003 pour une base Oracle 8.1.7.0, pour cr=E9er un=20
nouvel enregistrement dans une table avec une clef primaire GUID, et=20
conna=EEtre en retour la valeur de la clef ?

J'ai essay=E9 de g=E9n=E9rer le GUID sous Access et de le passer sous for=
me de=20
cha=EEne de caract=E8res dans la requ=EAte INSERT INTO avec le GUID parmi=
les=20
champs renseign=E9s, mais je me ramasse une erreur ORA-00911 (soit=20
-2147217900 pour Access), caract=E8re non valide, sur

UPDATE TABTEST SET CLEF=3D'{95401BD8-9103-4AFC-AC59-CF3247769106}' WHERE =

SURNOM =3D 'Minette';

alors que dans SQL*Plus la r=E9ponse est "1 ligne mise =E0 jour".

(j'ai eu la m=EAme erreur lors du INSERT INTO, le UPDATE est juste plus=20
facile =E0 r=E9p=E9ter pour r=E9diger la question).

Si je remplace les apostrophes autour du GUID par des guillemets,=20
j'obtiens, m=EAme sous SQL*Plus, l'erreur ORA-00972, l'identificateur est=
=20
trop long.
Lorsque j'ai fait une recherche l=E0-dessus je suis tomb=E9 sur des=20
consid=E9rations fumeuses, du style les noms de tables et noms de champs =

sont limit=E9s =E0 trente caract=E8res. Je cherche =E0 introduire un GUID=
dans=20
un champ, pas =E0 renommer le champ pour l'appeler comme ce que je cherch=
e=20
=E0 mettre dedans. Sommes-nous bien d'accord sur le fait que le nom de=20
champ "CLEF" ne comporte que quatre caract=E8res, et que la longueur d'un=
=20
GUID est impos=E9e ?

Il y aurait bien la solution d'ouvrir un objet Database pour y ouvrir un =

Recordset, mais je n'ai r=E9ussi =E0 faire =E7a qu'en lecture seule, donc=
pour=20
cr=E9er un enregistrement, pour le moment c'=E9tait fausse piste. (J'envo=
ie=20
mes requ=EAtes SQL sur un objet Connection.)

J'ai r=E9essay=E9 ma requ=EAte SQL ci-dessus en enlevant les accolades, e=
n=20
remettant les apostrophes, en enlevant les traits d'union ...

La base Oracle pourrait certes g=E9n=E9rer un GUID automatiquement lors d=
e=20
la cr=E9ation d'un enregistrement, mais la difficult=E9 est alors de=20
conna=EEtre sa valeur depuis Access, si on consid=E8re qu'on ne cr=E9erai=
t pas=20
de champ clef si les valeurs des autres champs =E9taient suffisantes pour=
=20
d=E9signer l'enregistrement vis=E9. Passer par l'heure de cr=E9ation,=20
peut-=EAtre ? Moui, si je ne trouve pas autre chose, d'autant qu'on=20
travaille en multi-utilisateurs ...

Pour le moment mon champ clef est de type CHAR(40).
Je sais qu'on peut aussi essayer RAW(16) -ah tiens, =E7a ne fait pas la=20
moiti=E9 de 40, =E7a ...- mais j'obtiens les m=EAmes erreurs en envoyant =
un=20
GUID vers un champ de ce type depuis Access.

Je n'ai probablement pas =E9puis=E9 toutes les combinaisons, mais si=20
quelqu'un pouvait me guider vers quelque chose de probant, j'appr=E9ciera=
is.

2 réponses

Avatar
Thom
Salut,

as-tu essayé de saisir ta requête en SQL dans un objet requête de type SQL
Direct (menu Requête/Spécifique SQL/SQL direct)?

Thomas


"Gloops" a écrit dans le message de news:
uzGf$
Bonjour tout le monde,

Je cherche à savoir quelle est la meilleure solution, en développant un
frontal Ms-Access 2003 pour une base Oracle 8.1.7.0, pour créer un
nouvel enregistrement dans une table avec une clef primaire GUID, et
connaître en retour la valeur de la clef ?

J'ai essayé de générer le GUID sous Access et de le passer sous forme de
chaîne de caractères dans la requête INSERT INTO avec le GUID parmi les
champs renseignés, mais je me ramasse une erreur ORA-00911 (soit
-2147217900 pour Access), caractère non valide, sur

UPDATE TABTEST SET CLEF='{95401BD8-9103-4AFC-AC59-CF3247769106}' WHERE
SURNOM = 'Minette';

alors que dans SQL*Plus la réponse est "1 ligne mise à jour".

(j'ai eu la même erreur lors du INSERT INTO, le UPDATE est juste plus
facile à répéter pour rédiger la question).

Si je remplace les apostrophes autour du GUID par des guillemets,
j'obtiens, même sous SQL*Plus, l'erreur ORA-00972, l'identificateur est
trop long.
Lorsque j'ai fait une recherche là-dessus je suis tombé sur des
considérations fumeuses, du style les noms de tables et noms de champs
sont limités à trente caractères. Je cherche à introduire un GUID dans
un champ, pas à renommer le champ pour l'appeler comme ce que je cherche
à mettre dedans. Sommes-nous bien d'accord sur le fait que le nom de
champ "CLEF" ne comporte que quatre caractères, et que la longueur d'un
GUID est imposée ?

Il y aurait bien la solution d'ouvrir un objet Database pour y ouvrir un
Recordset, mais je n'ai réussi à faire ça qu'en lecture seule, donc pour
créer un enregistrement, pour le moment c'était fausse piste. (J'envoie
mes requêtes SQL sur un objet Connection.)

J'ai réessayé ma requête SQL ci-dessus en enlevant les accolades, en
remettant les apostrophes, en enlevant les traits d'union ...

La base Oracle pourrait certes générer un GUID automatiquement lors de
la création d'un enregistrement, mais la difficulté est alors de
connaître sa valeur depuis Access, si on considère qu'on ne créerait pas
de champ clef si les valeurs des autres champs étaient suffisantes pour
désigner l'enregistrement visé. Passer par l'heure de création,
peut-être ? Moui, si je ne trouve pas autre chose, d'autant qu'on
travaille en multi-utilisateurs ...

Pour le moment mon champ clef est de type CHAR(40).
Je sais qu'on peut aussi essayer RAW(16) -ah tiens, ça ne fait pas la
moitié de 40, ça ...- mais j'obtiens les mêmes erreurs en envoyant un
GUID vers un champ de ce type depuis Access.

Je n'ai probablement pas épuisé toutes les combinaisons, mais si
quelqu'un pouvait me guider vers quelque chose de probant, j'apprécierais.
Avatar
Gloops
J'ai essayé de générer le GUID sous Access et de le passer sous forme
de chaîne de caractères dans la requête INSERT INTO avec le GUID pa rmi

les champs renseignés, mais je me ramasse une erreur ORA-00911 (soit
-2147217900 pour Access), caractère non valide, sur

UPDATE TABTEST SET CLEF='{95401BD8-9103-4AFC-AC59-CF3247769106}'
WHERE SURNOM = 'Minette';


Bjr,

Comme disait Coluche, "Je vous le donne Emile !" ...

Le caractère invalide, c'est le point-virgule !

Si je relance la même requête sans y inclure le point-virgule de
terminaison, ça passe comme une lettre à la poste (enfin ... celle
d'avant l'OMC). Je n'ai plus qu'à vérifier avec un DLookup derrière que
ça a bien été enregistré, et l'affaire est réglée.

Eh bien comme on dit, la nuit porte conseil ...

Si je mets des guillemets l'identificateur reste trop long, enfin bon on
ne met pas de guillemets autour d'un GUID et puis c'est tout.


*

(J'ai essayé ce que dit Thomm, mais sans réelle surprise, m'a été dit
que je devais faire appel à une requête accessible en écriture.)

En fait, je n'ai pas encore tout terminé pour ce qui est d'écrire une
chaîne de caractères.
De cette manière, je peux insérer un "e dans l'a" directement dans la
requête INSERT INTO, en tapant le caractère 230 au pavé numérique dans
la requête INSERT INTO, donc jusque là rien à redire.
En revanche, pour le e dans l'o, qui ne fait pas partie de la même
partie de la table, il y a plus de boulot. Je veux dire, pour
l'utilisateur ce sera pareil, mais le code ne pourra pas passer
directement le champ dans la requête.

Si je l'insère de cette manière, il n'est pas reconnu.
Si je l'insère par la fonction CHR() d'Oracle, pas de problème il est
inséré (pas lisible depuis SQL*Plus, mais lisible depuis Access, ce q ui
est l'essentiel), mais alors ça veut dire qu'il faut détecter dans la
chaîne à insérer tous les caractères devant faire l'objet de ce g enre de
précaution, et puis les insérer avec quelque chose comme

UPDATE TABTEST SET SURNOM=CONCAT('C', CONCAT(CHR(156), 'ur')) WHERE
NOM='Minette'

Il faut être motivé ;)

D'autant que j'ai repéré le e dans l'o, mais certainement d'autres
caractères, encore, doivent faire l'objet de cette cuisine.
Et ci-dessus j'ai donné un exemple en dur, mais il faudra que je déte cte
la position de chaque caractère à traiter, et générer automatique ment
une requête résultante capable de transférer la chaîne.

Si j'ai un peu de chance, quelqu'un a déjà eu à mitonner ça ...
Je pense au temps que ça pourrait me faire gagner ... vertigineux :)

(ou alors peut-être y a-t-il une solution moins besogneuse, ça aurait
même l'avantage de plus d'élégance, peut-être.)

Oh mais je réalise ... une fois qu'on manipule des fonctions CONCAT et
CHR on entre plus dans le domaine d'Oracle, d'autant que dans SQL*Plus
la syntaxe est la même.
Allez, je vais aller recopier ça où il faut. Enfin si les anciens de la
discipline lisent ici ...

En tout cas merci à tous ceux qui ont pris le temps de lire, et à Tho mm
qui a même fait plus.