|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
Bonjour,
Je fais appel à votre connaissance pour tenter de résoudre une incompréhension: Pour la clarté du problème énoncé, je vais rester très théorique car rentrer dans le détail n'apporterai rien et risquerait au contraire de compliquer les choses: Soit une table T contenant les colonnes A et B (invariables) Soit une fonction F( A, B ) dont la valeur de retour représente une table T' Je souhaite stocker le meilleur résultat de la table T' retournée par la fonction F( A, B ) pour chaque ligne de T dans une colonne C Pour se faire j'ai essayé plusieurs méthodes telles que : - UPDATE T SET C = ( SELECT X FROM F( A, B ) ORDER BY X DESC LIMIT 1 ) => Error Heading - Créer un trigger ON INSERT/UPDATE pour que C = ( SELECT X FROM F( A, B ) ORDER BY X DESC LIMIT 1 ) - Faire un UPDATE blanc du type UPDATE T SET A = A pour forcer le calcul de C => Error Heading ... Bref je pense que je dois passer à côté de quelque chose qui m'échappe. L'erreur de retour ne me permet pas de comprendre l'origine de mon problème, je ne vois pas à quoi cela peut correspondre Si quelqu'un pense pouvoir me venir en aide, je lui en serais très reconnaissant Cordialement |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Quelle est la déclaration de la fonction F?
|
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
Pour la fonction F, je la déclare de la manière suivante:
Code :
CREATE OR REPLACE FUNCTION F( A numeric, B numeric ) RETURNS SETOF type_x AS ... Code :
(où a et b sont des valeurs test) j'ai bien un tableau de valeurs |_X_| | 10 | | 15 | | 12 | La fonction F( A, B ) est donc valide (les valeurs qu'elle retourne sont correctes) je souhaite dans cet exemple stocker la valeur 15 dans la colonne C de la ligne de T pour laquelle A = a et B = b Merci pour votre aide précieuse |
||
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Le problème est que quand tu fais x est du type numeric et non pas du type type_x.
Ca doit passer avec: Code :
UPDATE t SET c=(SELECT row(x)::type_x FROM f(a,b) ORDER BY x DESC LIMIT 1) |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
Merci pour votre réponse,
L'ajout de ::type_x ne change pas le problème malheureusement Je souhaite juste apporter une petite correction dans l'énoncé, le message d'erreur n'est pas " Ayant fait part de ce problème à un ami, il pense que le problème provient du fait que l'UPDATE attend une valeur sans entête après "C =" et que le fait de retourner une valeur provenant d'un tableau via un SELECT, cette dernière est munie d'une entête que l'UPDATE ne comprend pas, d'où le message d'erreur Invalid Heading (d'après ce que j'en ai compris). Sauriez-vous m'en dire un peu plus à ce propos ? Merci encore pour votre aide Lorsque je tape "postgresql" + "invalid heading" sur Google, je prend peur par le nombre de résultats |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 954 ![]() |
Code :
UPDATE t SET c=(SELECT MAX(X) AS XMAX FROM f(a,b)) A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
Code :
UPDATE t SET c=(SELECT MAX(X) AS XMAX FROM f(a,b)) Je finis pas me demander si cette forme d'écriture est possible, vous-même avez-vous déjà eu l'occasion d'avoir recours à ce type de procédé pour mettre à jour un champ (invariable par la suite) sur un grand nombre de lignes? J'ai bien essayé une procédure plpgsql du type: Code :
|
||
|
|
00
|
|
|
#8 | ||||
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
De mémoire je n'ai jamais vu l'erreur "Invalid heading".
Par ailleurs ça fonctionne pour moi, voici un test avec postgresql 8.4: Code :
Code :
|
||||
|
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
Bonsoir estofilo,
Ma fonction F( A, B ) prend pour paramètres les champs A et B de la table T dans le UPDATE |
|
|
00
|
|
|
#10 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
A toi de partir de mon exemple qui passe sans erreur pour le transformer pas à pas en ton cas réel qui provoque l'erreur.
|
|
|
00
|
|
|
#11 | ||
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
Merci pour ta réponse, j'ai réadapté un exemple simple pour vérifier que ce procédé ne pose pas de problème avec une fonction qui calcule les solutions à l'équation x^2 = nombre (elle n'a ici aucun intérêt c'est pour l'exemple)
Code :
Je peux déjà mettre hors de cause la façon d'écrire (un peu particulière?) mon UPDATE. Le problème vient de plus haut. Aussi je me pose la question si ma fonction f ne retourne aucune ligne, la colonne C prend elle pour valeur null? (sachant que null est bien autorisé dans la déclaration de ma table T pour la colonne C) Je vais continuer à fouiller pas à pas, en te remerciant pour ton aide |
||
|
|
00
|
|
|
#12 |
|
Invité de passage
![]() Inscription : février 2011 Messages : 12 ![]() |
J'ai trouvé ma STUPIDE (comme trop souvent malheureusement) erreur :
Ma fonction F(A,B) n'était pas si parfaite que ça, il y avait des valeurs A et B pour lesquelles elle retournait un message d'erreur que mon UPDATE ne retournait pas à son tour. Merci infiniment à vous deux de m'avoir mis sur la voix (je m'en veux tellement d'être passé à côté d'un truc comme ça). En tout cas j'aurais appris beaucoup avec cette erreur à force de chercher les causes possibles
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com