Vous n'êtes pas identifié(e).
j'ai le message suivant
ERREUR: l'expression de la fonction du FROM ne peut pas faire référence à d'autres
relations sur le même niveau de la requête
État SQL :42P10
Caractère : 26
est_il possbible de contourner
requete:
select * from a,b(a.col1) where a.col1 like '%XXX%'
en oracle on avait
select * from a,table(b(a.col1)) where a.col1 like '%XXX%'
merci pour vos réponses
Hors ligne
Bonjour,
Pour avancer, c'est quoi, b, dans cette expression ? Une fonction retournant un setof ?
Marc.
Hors ligne
oui c'est une fonction qui renvoie un setof d'un objet
CREATE OR REPLACE FUNCTION b(x character varying)
RETURNS SETOF c_object AS
$BODY$
BEGIN
RETURN QUERY SELECT getItem_id::varchar(30), model_id, CAST(item_id AS varchar(30)), item_family_id, manager_id, local_manager_id,
unit_code_id, decimal_size, internal_cost_qty, bom_qty,
title_percent, bom_level, model_marketable, technical_index,
current_index, customs_code, item_state, kit
FROM model, getitem_id(x) WHERE model_id = getmodel(x);
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
Hors ligne
Dans ce cas, je présume que voulez faire un produit cartésien entre a et b(un enregistrement de a) ? La syntaxe est effectivement bizarre (et ça ne m'étonnerait pas que ça ne soit pas autorisé SQL, même si je n'en suis pas sûr).
Bref, est ce que :
SELECT *,b(test.a) from test;
Est ce que vous souhaitez ?
Marc.
Hors ligne
oui mais dans ce cas je n'arrive pas à utiliser les colonnes de ma fonction
Hors ligne
Utiliser ? Vous voulez dire qu'ils sont dans un champ composite ?
Marc.
Hors ligne
si vous voulez quand je fais select * from test('AAA') j'obtiens un resultat sous forme de colonne correspondant à mon return
si je fais select test('AAA') j'obtiens le debut du resultat precedé par une paranthèse
Hors ligne
normalement, avec une fonction SRF, la syntaxe suivante retourne tout le résultat dans un seul champs effectivement:
SELECT function (...)
Si vous voulez que chaque champs du type composite soit dans une colonne propre, utilisez la syntaxe suivante:
SELECT (function (...)).*;
Soit, avec l'exemple de Marc:
SELECT a.*, (b(test.a)).* from test;
Hors ligne
ok merci beaucoup . je n'avais pas trouvé la syntaxe dans la doc
Hors ligne
Tu m'ôtes les mots de la bouche
Histoire d'expliquer quand même la solution, un type composite, comm, c_object, c'est "comme un enregistrement de table", donc on peut faire un .* dessus. Les parenthèses, c'est parce que sinon, l'analyseur syntaxique ne saurait pas, dans «b(test.a).*» sur quoi appliquer le .*
Marc.
Hors ligne