Comment puis-je me débarrasser de "ORA-01489: résultat de la concaténation de chaîne est trop long" dans cette requête?
cette requête est dominant, jeux en réseau. ainsi, par exemple, étant donné un réseau
A<----->B
B<----->C
B<----->D
C<----->E
D<----->C
D<----->E
F<----->E
il retourne
B,E
B,F
A,E
mais il ne fonctionne pas de données pour les grandes, parce que je suis à l'aide de méthodes string dans mon résultat. j'ai essayé de supprimer la chaîne de méthodes et de revenir à une vue ou quelque chose, mais en vain
With t as (select 'A' as per1, 'B' as per2 from dual union all
select 'B','C' from dual union all
select 'B','D' from dual union all
select 'C','B' from dual union all
select 'C','E' from dual union all
select 'D','C' from dual union all
select 'D','E' from dual union all
select 'E','C' from dual union all
select 'E','D' from dual union all
select 'F','E' from dual)
,t2 as (select distinct least(per1, per2) as per1, greatest(per1, per2) as per2 from t union
select distinct greatest(per1, per2) as per1, least(per1, per2) as per1 from t)
,t3 as (select per1, per2, row_number() over (partition by per1 order by per2) as rn from t2)
,people as (select per, row_number() over (order by per) rn
from (select distinct per1 as per from t union
select distinct per2 from t)
)
,comb as (select sys_connect_by_path(per,',')||',' as p
from people
connect by rn > prior rn
)
,find as (select p, per2, count(*) over (partition by p) as cnt
from (
select distinct comb.p, t3.per2
from comb, t3
where instr(comb.p, ','||t3.per1||',') > 0 or instr(comb.p, ','||t3.per2||',') > 0
)
)
,rnk as (select p, rank() over (order by length(p)) as rnk
from find
where cnt = (select count(*) from people)
order by rnk
) select distinct trim(',' from p) as p from rnk where rnk.rnk = 1`
Vous devez vous connecter pour publier un commentaire.
L'un de l'Oracle de limites, c'est que SQL ne peut pas gérer VARCHAR2 plus de 4000 caractères. Si vous essayez de renvoyer une chaîne de caractères qui dépassent cette taille, il lance l'ORA-01489. Idéalement, vous devriez essayer de briser le jeu de résultats dans de multiples petites lignes. Sinon, vous pouvez le retourner comme un CLOB.
modifier
Hmm...
Avoir regardé de plus près à votre code, je pense que le seul endroit qui va précipiter l'ORA-1489 est cette ligne:
Il serait facile de les envelopper cet appel dans
TO_CLOB()
. Malheureusement tournant P dans un CLOB sauts de certains de la transformation ultérieure (distinctes de p,
partition en p`) de sorte qu'il n'est probablement pas une option. Désolé.Comme pour les autres solutions de contournement....
Est-ce que votre site dispose d'une licence pour Oracle Spatial? Je connais pas beaucoup de sites le font, mais si le vôtre est l'un des plus chanceux (et que vous utilisez 10gR2 ou plus), alors vous devriez vérifier Oracle Spatial Réseau Modèle de Données (PDF).
Si, au contraire, il n'existe aucun moyen de restreindre la sortie de la
sys_connect_by_path()
appel, vous pourriez avoir à mettre en PL/SQL. Vous pouvez utiliser un PIPELINE FONCTION de retour de la dernière sortie de sorte que vous pouvez toujours appeler à partir d'une instruction SELECT.Dans mon expérience, vous ne voulez pas faire de complexe, la manipulation des chaînes dans les grandes, les requêtes compliquées, et cette requête est assez compliqué. Je suppose que ce problème pourrait très bien bénéficier d'une réflexion et d'une approche différente, plutôt que de l'optimisation de la requête existante.
Ce qui ne les tables sous-jacentes et qu'est-ce exactement que vous souhaitez atteindre? Est-il possible de modifier le modèle de données?