WM_CONCAT avec la Clause DISTINCT Compilé par Forfait contre autonome Requête Problème
J'ai écrit un programme qui utilise le WM_CONCAT fonction. Lorsque j'exécute cette requête:
SELECT WM_CONCAT(DISTINCT employee_id)
FROM employee
WHERE ROWNUM < 20;
Il fonctionne très bien. Lorsque j'essaie de compiler le relativement même requête dans un paquet de la fonction ou de la procédure, il produit cette erreur: PL/SQL: ORA-30482: DISTINCT option ne permet pas, pour cette fonction
FUNCTION fetch_raw_data_by_range
RETURN VARCHAR2 IS
v_some_string VARCHAR2(32000);
BEGIN
SELECT WM_CONCAT(DISTINCT employee_id)
INTO v_some_string
FROM employee
WHERE ROWNUM < 20;
RETURN v_some_string;
END;
Je me rends compte WM_CONCAT n'est pas officiellement pris en charge, mais quelqu'un peut m'expliquer pourquoi il travail comme un stand alone de requêtes DISTINCTES, mais pas compiler dans un paquet?
Vous devriez être en mesure d'obtenir des résultats similaires avec la LISTAGG fonction.
J'ai marqué ce que oracle10g, qui ne prévoit pas cette fonction
J'ai marqué ce que oracle10g, qui ne prévoit pas cette fonction
OriginalL'auteur Reimius | 2013-10-24
Vous devez vous connecter pour publier un commentaire.
Problème est que WM_CONCAT est stockée procédure écrite sur pl/sql.
Il y a un bug ouvert #9323679: PL/SQL APPEL d'UN UTILISATEUR DÉFINI AGGREGRATE FONCTION DISTINCTS AVEC ÉCHOUE ORA-30482.
Solution de contournement pour ce type de problèmes est l'aide de sql dynamique.
Donc, si vous enveloppez votre requête dans
Alors il devrait fonctionner.
Mais comme OldProgrammer a déjà suggéré, il vaut mieux éviter d'utiliser ce WM_CONCAT à tous.
Désolé, il semble que je vais mélanger un peu ce problème avec la nouvelle 11g comportement. Je suis à la fixation de cette réponse.
Ah, donc c'est un bug et pas dû à une exigence fonctionnelle. Merci pour le matériau de référence. Je n'ai pas accès à leur système de suivi, mais j'ai été capable de trouver plus de messages liés à un numéro de bogue.
OriginalL'auteur Nagh
PL/SQL ne vous permettra pas d'utiliser
distinct
dans une base de données de la fonction, et cette question montre que le SQL-moteur et le PL/SQL-moteur ne pas utiliser le même analyseur.L'une des solutions à ce problème est l'utilisation de sous-requête en tant que ci-dessous,
Une autre solution est d'utiliser le SQL dynamique comme Nagh suggéré,
OriginalL'auteur Dba