ORA-00907 Erreur lors de l'utilisation dans une fonction analytique Query (PS / Query, PeopleTools 8.51.12)

StackOverflow https://stackoverflow.com/questions/8807183

Question

Requête de lancer une erreur ORA-00907 lorsque je tente de coller une liste de valeurs dans un critère.

Historique : Je ne suis pas un développeur, je suis juste un utilisateur final qui est assez étudié pour où je peux écrire des requêtes en utilisant PS / requête au sein de Peoplesoft, pour la mise en œuvre de mon entreprise. Je travaille avec le module FSCM de Peoplesoft (Institutions financières et Supply Chain Management), actuellement sur la version FSCM 8.90.08.024, je pense que l'utilisation d'Oracle 11g comme la base de données de base.

Je suis surtout autodidacte, et les experts techniques que nous avons sont occupés avec des trucs base de données / application, ou ils ne sont pas familiers avec mon Les besoins de données spécifiques de la section.

Je tiens à souligner que je suis incapable d'écrire directement des instructions SQL pour Interroger la base de données. Je dois utiliser un programme intégré appelé « PS / requête » (Également connu sous le nom de requête Manager) avec une interface graphique qui écrit le SQL pour vous et il enregistre comme une requête que vous pouvez exécuter à la base de données extrait Les données. Ce ne concerne que ma question en ce que:

1. I cannot create or alter views/tables
2. I cannot perform any type of SQL Statement except "SELECT"
3. I can embed PL/SQL, MetaSQL and plain SQL into Expressions
4. At this point, Query Manager is the only option I have.

PS / requête est ma seule expérience avec SQL jusqu'à présent, à part d'Oracle la documentation et des sites comme celui-ci. D'après mes recherches, il est considéré comme extrêmement confinant par « réelles » les restrictions SQL programmers.The sur elle vous obliger à faire les choses d'une manière qui viole ce qui semble être les meilleures pratiques de codage SQL.

Requête Requête: J'ai une question que j'ai demandé d'écrire qui sort dépenser (sur les bons et bons de commande) contre certains défini par le système Codes de catégorie. Ce que je suis en train de faire est de tirer dans Voucher ID, la somme les montants des marchandises sur eux par le vendeur et catégorie de code, et l'affichage Les resultats. En d'autres termes, pour chaque combinaison unique de Vendeur / Catégorie, additionnez tous les montants qui ont Voucher que combinaison fournisseur / Catégorie.

Utilisation de la SUM (Fieldname) OVER (PARTITION fieldName, nomchamp) syntaxe.

Ainsi, le résultat final devrait ressembler à quelque chose comme ...

Code     Vendor    Amount
123-45   Acme     $5000.00
123-45   Apple    $4200.00
123-46   Acme     $750.00

Cela dit, voici le SQL Query Manager affiche pour obtenir le jeu de résultats que j'ai montré:

SELECT DISTINCT D.CATEGORY_CD, D.TN_DESCR1000, C.VENDOR_ID, E.NAME1, SUM ( A.MERCH_AMT_VCHR) OVER (PARTITION BY  D.CATEGORY_CD,  C.VENDOR_ID),E.SETID,E.VENDOR_ID 
  FROM PS_PO_LINE_MATCHED A, PS_PO_LINE B, PS_PO_HDR C, PS_ITM_CAT_TBL D, PS_VENDOR E, PS_PYMNT_VCHR_XREF F 
  WHERE A.BUSINESS_UNIT = B.BUSINESS_UNIT 
     AND A.PO_ID = B.PO_ID 
     AND A.LINE_NBR = B.LINE_NBR 
     AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
     AND B.PO_ID = C.PO_ID 
     AND D.CATEGORY_ID = B.CATEGORY_ID 
     AND D.EFFDT = 
        (SELECT MAX(D_ED.EFFDT) FROM PS_ITM_CAT_TBL D_ED 
        WHERE D.SETID = D_ED.SETID 
          AND D.CATEGORY_TYPE = D_ED.CATEGORY_TYPE 
          AND D.CATEGORY_CD = D_ED.CATEGORY_CD 
          AND D.CATEGORY_ID = D_ED.CATEGORY_ID 
          AND D_ED.EFFDT <= SYSDATE) 
     AND ( F.SCHEDULED_PAY_DT >= TO_DATE('2010-07-01','YYYY-MM-DD') 
     AND F.SCHEDULED_PAY_DT <= TO_DATE('2011-06-30','YYYY-MM-DD')) 
     AND D.CATEGORY_CD LIKE :1 
     AND E.VENDOR_ID = C.VENDOR_ID 
     AND A.BUSINESS_UNIT = F.BUSINESS_UNIT 
     AND A.VOUCHER_ID = F.VOUCHER_ID 
  ORDER BY 1

problème sous-jacent: Cela fonctionne très bien, mais il ne peut rapidement sur un Code catégorie à la fois. Codes de catégorie sont 5 chiffres, à 3 chiffres sous-classe « classe » suivi d'un tiret, puis un 2 chiffres « . J'ai une liste de 375 Codes de catégorie je dois obtenir ce résultat pour la requête.

Je l'ai mis en place une invite sur cette version qui permet l'entrée d'une Wildcard (Donc, 123 - %%), mais est encore une centaine de séries distinctes de la Requete. Gestionnaire des requêtes permet l'utilisation d'un type d'expression « dans la liste » dans Les critères, mais il vous faut entrer manuellement chaque entrée dans la liste.

Je suis en train de le mettre en place à l'endroit où je peux coller une copie du texte brut Liste des codes dans une expression, avec guillemets propres / virgules, et avoir ÉVALUER que pour me donner une liste combinée de tous les codes de NIGP spécifié. Le champ Libellé créés par Query Manager ne permet pas coller des listes (pour autant que je sache).

Solution Tentative: J'ai regardé la page http://peoplesoft.ittoolbox.com/groups/technical-functional/peoplesoft-other-l / créer une expression-en-90 PSOFT-query-à-coller-a-liste-de-emplids-2808427 et j'ai essayé quelques-unes des réponses qui y sont données, mais aucun d'entre eux travaillaient. Cette page conduit à me essayer cette SQL modifiée (évidemment la liste des codes est tronqué un peu pour l'affichage ici):

SELECT DISTINCT D.CATEGORY_CD, D.TN_DESCR1000, C.VENDOR_ID, E.NAME1, SUM (  A.MERCH_AMT_VCHR) OVER (PARTITION BY  D.CATEGORY_CD,  C.VENDOR_ID),E.SETID,E.VENDOR_ID 
  FROM PS_PO_LINE_MATCHED A, PS_PO_LINE B, PS_PO_HDR C, PS_ITM_CAT_TBL D, PS_VENDOR E,  PS_PYMNT_VCHR_XREF F 
  WHERE A.BUSINESS_UNIT = B.BUSINESS_UNIT 
     AND A.PO_ID = B.PO_ID 
     AND A.LINE_NBR = B.LINE_NBR 
     AND B.BUSINESS_UNIT = C.BUSINESS_UNIT 
     AND B.PO_ID = C.PO_ID 
     AND D.CATEGORY_ID = B.CATEGORY_ID 
     AND D.EFFDT = 
        (SELECT MAX(D_ED.EFFDT) FROM PS_ITM_CAT_TBL D_ED 
        WHERE D.SETID = D_ED.SETID 
          AND D.CATEGORY_TYPE = D_ED.CATEGORY_TYPE 
          AND D.CATEGORY_CD = D_ED.CATEGORY_CD 
          AND D.CATEGORY_ID = D_ED.CATEGORY_ID 
          AND D_ED.EFFDT <= SYSDATE) 
     AND ( F.SCHEDULED_PAY_DT >= TO_DATE('2010-07-01','YYYY-MM-DD') 
     AND F.SCHEDULED_PAY_DT <= TO_DATE('2011-06-30','YYYY-MM-DD')) 
     AND D.CATEGORY_CD = '005-00' OR  D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'') 
     AND E.VENDOR_ID = C.VENDOR_ID 
     AND A.BUSINESS_UNIT = F.BUSINESS_UNIT 
     AND A.VOUCHER_ID = F.VOUCHER_ID 
  ORDER BY 1

Et le SQL ci-dessus est ce qui me donne l'erreur ORA-00907. Quelqu'un at-il rencontré ce problème avant? Massive mur de texte, je sais. Mes excuses. Ceci est mon premier post ici et je suis en train de ne pas laisserquoi que ce soit sur pertinent.

J'ai le problème immédiat qui a poussé cette question fixe, mais cette demande est que la pointe d'un iceberg très grand, et à un moment donné, je dois trouver un moyen de pouvoir coller des listes en tant que critères plaintext en utilisant Gestionnaire des requêtes, de préférence d'une manière qui joue bien avec analytique Regroupement.

TL; version DR:

Utilisation de Peoplesoft Gestionnaire des requêtes pour faire une analytique SUM avec le regroupement en utilisant plus, PARTITION BY. Lorsque je tente de coller une liste dans les critères, il renvoie une erreur ORA-00907.

Toute aide serait grandement appréciée. Merci!

Était-ce utile?

La solution

Après le lien que vous avez posté , je vois 2 méthodes pour faire ce que vous essayez d'accomplir. J'ai aussi remarqué que vous avez essayé une 3ème méthode.

  • Méthode 1

    • Critères> Critères Ajouter
    • Type d'expression: Caractère
    • Longueur: 255
    • Expression Texte: D.CATEGORY_CD IN ( '015-00', '015-06', '015-10', '615-07') et 1
    • Condition Type: égal à
    • constante: 1
  • Méthode 2

    • Critères> Critères Ajouter
    • Domaine: D.CATEGORY_CD
    • Condition Type: dans la liste
    • Valeur: 015-00' , '015-06', '015-10', '615-07
  • Méthode 3 (Votre méthode)

    • Critères> Critères Ajouter
    • Domaine: D.CATEGORY_CD
    • Condition Type: égal à
    • Définir expression: '015-00' OU EN D.CATEGORY_CD ( '015-00', '015-06', '015-10', '615-07')

Question) Est-ce que le match ci-dessous exactement le texte que vous mettez la boîte d'expression?

'015-00' OU EN D.CATEGORY_CD ( '015-00', '015-06', '015-10', '615-07')

Sinon, qu'est-ce que vous mettez dans cette boîte?

Autres conseils

Ok, après un peu plus tordant avec cela, je l'ai trouvé ce que je pense est la question sous-jacente.

L'erreur, dans ce cas, est double. Une partie de c'était ma faute (je n'ai pas vérifié pour Peoplesoft mutiler les guillemets, je tire de la Parole), et une partie de celui-ci était la façon dont Gestionnaire des requêtes interprète certains types de fonctions (vous devez envelopper des choses dans le cas où la déclaration pour l'obtenir pour évaluer correctement).

Tout d'abord, la partie "My Fault":

Chaque fois que je coller dans ma liste des codes NIGP de test, je le faisais à partir d'un fichier que je continuais enregistré dans Microsoft Word.

Ce qui a sans doute les-pratiques « remplacer les guillemets droits avec Guillemets » fonctionnalité. Peoplesoft va bonkers lorsque son présenté une « citation intelligente », et les affichera comme des points d'interrogation à l'envers (il y a probablement un terme technique, je ne sais pas).

Alors, quand je voudrais tester des suggestions (telles que la fixation de l'ordre citation / virgule comme suggéré par @Rene Nyffenegger et @WayneH) Je commencerai par ma requête de test de base, ajouter les expressions et le tester, l'enregistrer comme une requête distincte. S'ils ne travaillaient pas, je vais revenir à la requête de base. De cette façon, je pouvais itérer changements et enregistrer des tests potentiels que les différentes versions.

Mon erreur a été de ne pas enregistrer les différentes versions, en laissant l'application et retourner. C'est lorsque vous enregistrez la requête, quittez la page, allez ailleurs PEOPLESOFT, puis revenir à ouvrir Gestionnaire des requêtes qui il en fait vous montre que cela fait la conversion de caractères. Vous ne pouvez pas voir à moins que vous le faites. Même si Gestionnaire des requêtes est fait. Il a donc été jeter un caractère Gestionnaire des requêtes ne reconnaîtrait pas, mais pas me montrer le caractère qu'il ne reconnaîtrait pas.

J'obtenu un nouveau PC de travail récemment, et je l'ai maintenant désactivé l'auto-remplacement Guillemets pour une utilisation future.

En second lieu, le « Gestionnaire des requêtes: partie:

Sur la version de ce que je suis arrivé au travail, j'UTILISE envelopper la fonction « IN » dans une déclaration de cas. J'ai trouvé que beaucoup de fonctions SQL, lorsqu'il est utilisé « ordinaire » (comme je les définis par juste coller copie de pages de définitions d'Oracle et remplir les variables appropriées) ont tendance à donner PS / requête (Gestionnaire des requêtes) des brûlures d'estomac . Mais si vous les envelopper dans un boîtier ... QUAND ... instruction END qui permet d'évaluer le résultat de la fonction, puis construire un critère qui sélectionne en fonction de certaines valeurs de ce résultat, la fonction va fonctionner et afficher correctement un résultat.

Donc, pour un exemple, mis en place cette expression (comme dans l'exemple de @ qyb2zm302). J'utilise différents codes de ce qui était dans mon exemple original, mais ils fonctionnent de la même (ils sont tous à cinq chiffres, codes tapés caractère composé de trois chiffres, un tiret, puis deux chiffres)

Case when  E.CATEGORY_CD  IN
                  ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
    then 'true' 
    else 'false' 
    end 

Et puis définissez un critère:

    AND 
        Case when  E.CATEGORY_CD  IN
                  ('375-15', '375-30', '375-54', '375-60', '380-30','938-63') 
                   then 'true' 
                   else 'false' 
        end 
   = 'true'

Il va courir à remplir et à retourner toutes les lignes qui ont ce code de catégorie.

Si vous ne voulez pas faire cela, vous pouvez faire comme dans @ Méthode de qyb2zm302 2. Le seul inconvénient que dans Query Manager est que vous devez les entrer en lignes individuelles dans la « Liste », et si vous ne peut-coller copie 25 à la fois.

emballage dans une déclaration de cas vous permet de le coller directement dans une expression, ce qui est beaucoup mieux pour les listes plus grandes.

Solutions:

Ce qui précède est le code que je suis allé avec qui a travaillé. Il est de simplifier un peu pour souci de concision, mais il fonctionne.

  1. Dans la liste fonctionne grâce à l'option Gestionnaire des requêtes natif aussi longtemps que vous manuellement Renseigner la liste

  2. D.CATEGORY_CD = '005-00' OR fonctionne aussi longtemps que vous l'envelopper dans une déclaration de cas

  3. D.CATEGORY_CD IN ( '015-00', '015-06', '015-10', '615-07') fonctionne aussi longtemps que vous l'envelopper dans une déclaration de cas

  4. Peoplesoft déteste Guillemets. Aucun des travaux de volonté ci-dessus si vous copiez des guillemets directement à partir de Word, mais vous ne le verrez pas à moins que vous enregistrer, partir et deRetour à la même requête en mode édition

  5. Mise en forme est importante. Tous les nécessaire la bonne virgule / citation mise en forme, comme en pointe par René et Wayne. Signification: ( 'xxx-xx', 'xxx-01', 'xxx-02') etc

Merci à tous ceux qui ont contribué à ce sujet! Je ne pense pas avoir la tête desked ce disque avant sur toute question, mais je suppose que cela fait partie du processus d'apprentissage. Étant donné que toutes les réponses affichées sont valides et correctes (ou au moins une partie de la plus grande « correcte »), je vais les signaler tous.

 D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'') 

regarde partie me louche

Depuis un '' dans une chaîne « correspond » à un seul ' la première chaîne est

'015-00,'' '

suivi par (le non-string)

015-06,

Le '' suivant est probablement la chose que l'analyseur trébuche sur, car il est assez dénué de sens.

Modifier essayez avec un D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07').

Je pense que les critères de D.CATEGORY_CD vous donnent les problèmes, j'ai changé les guillemets doubles guillemets simples et il encore regardé étrange pour moi. Je remarque alors les virgules sont à l'intérieur de vos citations et non entre eux, essayer de faire le regard de la ligne un des critères comme celui-ci:

avant:

OR  D.CATEGORY_CD IN ('015-00,'' '015-06,'' '015-10,'' '615-07'')

après:

OR  D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07')

En outre, le « IN » est un sous-entendu « OU » et je ne sais pas si vous avez entre parenthèses autour des deux D.CATEGORY_CD, Je voudrais juste mettre celui du code supplémentaire dans les critères IN et supprimer la ligne « D.CATEGORY_CD = »:

avant:

AND D.CATEGORY_CD = '005-00' OR  D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07') 

après:

AND D.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07', '005-00')

Bien sûr, vous commandez déjà par CATEGORY_CD, vous pouvez supprimer ce critère et tirer toutes les catégories en un seul passage (qui est à moins il y a trop de lignes pour Excel), et vous pouvez également inclure soit VENDOR_ID ou NAME1 dans la clause ORDER BY.

L'espoir qui vous aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top