Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
Je suis en train d'écrire un traitement qui lit un fichier et injecte les lignes dans une table de travail. Je voudrais que chaque ligne de la table soit identifiée de façon unique, j'ai donc décidé de créer une séquence.
Dans mon traitement, j'ai le code suivant :
SELECT SEQ_TEMP_IMPORT_DEVIS.NEXTVAL INTO :li_t_id_devis FROM DUAL;
Pourtant quand je boucle, la valeur de mon champ li_t_id_devis est toujours à 0 alors que quand je regarde en base, la propriété "Last value" de ma séquence s'est bien incrémentée.
Est ce que quelqu'un peut aiguiller un novice en la matière comme moi?
Merci à tous pour votre aide.
Environnement :
PB 10.5
Oracle 10g
Windows XP
Dernière modification par Kyoshiro (28-01-2010 15:16:10)
Hors ligne
Bonjour, plutot que de faire ça dans PB, pourquoi ne pas utiliser un trigger directement dans Oracle, du genre :
CREATE OR REPLACE TRIGGER NOM_TABLE_BI BEFORE INSERT ON NOM_TABLE FOR EACH ROW BEGIN SELECT SEQ_TEMP_IMPORT_DEVIS.NEXTVAL INTO :NEW.ID_DEVIS FROM DUAL ; END;
NB :
Hors ligne
Bonjour et merci pour ta réponse rapide!
J'ai pensé à faire de cette façon, le probleme, c'est que j'ai besoin de récupérer la valeur à insérer à la volée pour pouvoir l'injecter en parallèle dans d'autres tables... Or en passant par le trigger, la valeur ne sera pas insérée dans la table tant que je n'ai pas fait d'update()
Ce n'est peut être effectivement pas ce qu'il y a de plus "joli", mais pourquoi ca ne marche pas via le SQL dynamique?
Hors ligne
Kyoshiro a écrit:
j'ai besoin de récupérer la valeur à insérer à la volée pour pouvoir l'injecter en parallèle dans d'autres tables... Or en passant par le trigger, la valeur ne sera pas insérée dans la table tant que je n'ai pas fait d'update()
qu'à cela ne tienne, utilise un trigger "After insert" pour les traitement en aval, ton Id sera alors dispo
Kyoshiro a écrit:
mais pourquoi ca ne marche pas via le SQL dynamique?
aucune idée, tu as regardé le code retour de SQLCA ? (d'ailleurs ce n'est pas du SQL dynamique mais du SQL embarqué "classique"... )
Hors ligne
Bonjour,
Juste une observation, tu oublies peut être de préciser (forcer) l'objet transaction pour ta requête :
SELECT colonne1 INTO :li_x FROM table1 WHERE XXX USING itr_trans;
Si tu ne le précises pas PB utilise par défaut l'objet transaction SQLCA et ce n'est pas forcément celui que tu utilises pour te connecter à la base d'où ton zéro en réponse.
Hors ligne
Oui, désolé pour l'abus de langage
Je n'ai pas regardé le code retour de l'objet SQLCA, c'est ce que je vais faire tout de suite.
Merci pour ta réponse, buck! J'ai déjà essayé de préciser l'objet transaction mais ca ne marche pas plus...
En ce qui concerne le trigger AFTER INSERT en fait, ça me pose également un probleme. Je m'explique.
Je veux importer un fichier qui contient le détail sur des devis à créer et les lignes de devis à rattacher aux devis. Je lis les lignes une par une et j'insère donc une ligne dans ma table temporaire des devis, c'est la que je veux récupérer la valeur de la séquence. Car à partir de la, je veux également insérer dans une autre table temporaire le détail des lignes de devis, avec la valeur de la séquence en "clé étrangère".
C'est pourquoi le trigger AFTER INSERT ne m'arrange pas plus qu'un trigger normal.
A moins que tu parles d'un autre usage du trigger que je n'ai pas compris...?
Hors ligne
Mais par rapport à l'objet connexion c'est ca qui m'étonne le plus : c'est que quand je suis en mode debug j'ai la valeur 0 dans la variable ou je voudrais récupérer ma séquence, mais quand je regarde en base le compteur s'est bien incrémenté... alors que dans le code il me renvoie toujours 0
Hors ligne
Si tu passes ta variable locale de "Integer" à "Long",
ça ne règle pas le problème?
Hors ligne
Non, ca ne change rien... Merci quand même pour la suggestion qui m'aura valu une petite frayeur
Hors ligne
Au niveau de ta connexion à la DB, active la trace ( TRS O10)
Dans le fichier trace, tu verras ce qui se passe.
Si ce n'est pas assez complet, essaie la trace étendue ( TRACE o10)
Hors ligne
J'ai trouvé :
En regardant la propriété SQLCA.SQLErrText aprés le SELECT sur la séquence, j'avais l'erreur "Table or view doesn't exist". J'ai donc enlevé le nom du schéma que j'avais ajouté dans le SELECT, le SQLErrText est devenu "Sequence doesn't exist".
En fait c'était un probleme de schéma tout bête, car il y a le schéma ou je crée mes tables, et celui ou l'application se connecte, j'avais oublié cette subtilité : un CREATE SYNONYM, un GRANT, et le tour est joué !
Quoiqu'il en soit, merci à tous de m'avoir aiguillé car je ne pense pas que j'aurais trouvé aussi rapidement sans votre aide!
Dernière modification par Kyoshiro (28-01-2010 15:17:41)
Hors ligne