1

値のリストを条件に貼り付けようとすると、クエリがORA-00907エラーをスローします。

背景私は開発者ではありません。会社の実装のために、Peoplesoft内でPS/Queryを使用してクエリを記述できるようになるまで十分に研究されたエンドユーザーです。私は、現在バージョンFSCM 8.90.08.024であるPeoplesoftのFSCMモジュール(Financials and Supply Chain Management)を使用しており、ベースデータベースとしてOracle11gを使用していると思います。

私はほとんど独学で、私たちが持っている技術専門家はデータベース/アプリケーション関連のもので忙しい、または彼らは私のセクションの特定のデータニーズに精通していません。

データベースをクエリするSQLステートメントを直接記述できないことを指摘しておく必要があります。「PS/Query」(クエリマネージャーとも呼ばれます)と呼ばれる組み込みプログラムをGUIで使用する必要があります。このプログラムは、SQLを書き込み、データベースに実行してデータを抽出できるクエリとして保存します。これは、次の点でのみ私の質問に関連しています。

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 / Queryは、Oracleのドキュメントやこのようなサイトを除けば、これまでのところSQLに関する私の唯一の経験です。私の調査によると、これは「実際の」SQLプログラマーによって非常に制限されていると考えられています。この制限により、SQLコーディングのベストプラクティスと思われる方法に違反する方法で作業を行う必要があります。

クエリリクエスト:特定のシステム定義のカテゴリコードに対して(バウチャーとPOの)支出を引き出す、作成をリクエストされたクエリがあります。私がやろうとしているのは、バウチャーIDを取得し、ベンダーとカテゴリコードごとに商品の金額を合計して、結果を表示することです。つまり、ベンダー/カテゴリの一意の組み合わせごとに、そのベンダー/カテゴリの組み合わせを持つすべてのバウチャーの金額を合計します。

SUM(フィールド名)OVER(PARTITION BYフィールド名、フィールド名)構文を使用します。

したがって、最終結果は次のようになります...

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

そうは言っても、上記の結果セットを取得するためにクエリマネージャーが表示しているSQLは次のとおりです。

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

根本的な問題:これは正常に機能しますが、一度に1つのカテゴリコードでしかプロンプトを表示できません。カテゴリコードは5桁で、3桁の「クラス」、ダッシュ、2桁の「サブクラス」です。このクエリ結果を取得するために必要な375のカテゴリコードのリストがあります。

このバージョンでは、ワイルドカードの入力を許可するプロンプトを設定しました(つまり、123-%%)が、それでもクエリを約100回実行することになります。Query Managerでは、Criteriaで「InList」式タイプを使用できますが、リストの各エントリを手動で入力する必要があります。

コードリストのプレーンテキストコピーを適切な引用符/カンマを使用して式に貼り付け、指定されたすべてのNIGPコードの組み合わせリストを取得できるように設定しようとしています。Query Managerによって作成されたPromptフィールドでは、リストの貼り付けは許可されていません(私が知る限り)。

解決策の試み:http://peoplesoft.ittoolbox.com/groups/technical-functional/peoplesoft-other-l/create-an-expression-in-psoft-90-query-to-paste-a-のページを表示しましたlist-of-emplids-2808427と私はそこで与えられた答えのいくつかを試しましたが、どれもうまくいきませんでした。そのページから、この変更されたSQLを試してみることになりました(明らかに、コードのリストはここに表示するために少し切り捨てられています)。

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

そして、上記のSQLは、ORA-00907エラーを引き起こしているものです。誰かが以前にこの問題に遭遇したことがありますか?テキストの巨大な壁、私は知っています。謝罪いたします。これはここでの私の最初の投稿であり、関連するものを何も残さないようにしています。

この質問に拍車をかけた当面の問題は修正されましたが、その要求は非常に大きな氷山の一角にすぎません。ある時点で、クエリマネージャーを使用してプレーンテキストリストを基準として貼り付ける方法を見つける必要があります。 、できればAnalyticGroupingとうまく連携する方法で。

TL; DRバージョン:

Peoplesoft Query Managerを使用して、OVER、PARTITIONBYを使用したグループ化で分析SUMを実行します。リストを条件に貼り付けようとすると、ORA-00907エラーがスローされます。

どんな助けでも大歓迎です。ありがとう!

4

4 に答える 4

2

さて、これをもう少し調整した後、私は根本的な問題であると思うものを見つけました。

この場合のエラーは2つあります。その一部は私のせいであり(PeoplesoftがWordから引き出した引用符を操作していることを確認しませんでした)、一部はQuery Managerが特定の種類の関数を解釈する方法でした(CaseWhenステートメントでいくつかのものをラップする必要があります)適切に評価するため)。

まず、「私のせい」の部分:

テストNIGPコードのリストに貼り付けるたびに、MicrosoftWordに保存したファイルから貼り付けていました。

これには、おそらく便利な「ストレートクォートをスマートクォートに置き換える」機能があります。Peoplesoftは、「スマートクォート」を提示すると、おかしなことになり、逆さまの疑問符として表示されます(おそらく専門用語がありますが、私にはわかりません)。

したがって、提案をテストするとき(@Rene Nyffeneggerと@WayneHによって提案された引用符/カンマの順序を修正するなど)、基本テストクエリから始めて、式を追加してテストし、別のクエリとして保存します。それらが機能しなかった場合は、基本クエリに戻ります。そうすれば、変更を繰り返して、潜在的なテストを別のバージョンとして保存できます。

私の間違いは、異なるバージョンを保存せず、アプリケーションを終了してから戻ることでした。クエリを保存し、ページを終了し、Peoplesoftの別の場所に移動してから、クエリマネージャーを開くと、実際に実行中であることが示されます。文字変換。そうしないと見えません。クエリマネージャがそれを行っているにもかかわらず。そのため、クエリマネージャが認識しない文字をスローしていましたが、認識できない文字は表示されませんでした。

最近、新しい仕事用PCを入手しましたが、将来使用するためにSmartQuotesの自動置換を無効にしました。

次に、「クエリマネージャ:パート:

私が動作するようになったこのバージョンでは、Caseステートメント内で「IN」関数をラップすることを利用しました。多くのSQL関数を「プレーン」で使用すると(Oracleの定義ページからコピーして貼り付け、適切な変数を入力するだけで定義するため)、PS / Query(Query Manager)に胸焼けを与える傾向があることがわかりました。 。ただし、関数の結果を評価するCASE ... WHEN ... ENDステートメント内にそれらをラップし、その結果の特定の値に基づいて選択する基準を作成すると、関数は機能し、結果を適切に表示します。

したがって、例として、この式を設定します(@ qyb2zm302の例のように)。元の例とは異なるコードを使用していますが、同じように機能します(3桁、ダッシュ、2桁で構成される5桁の文字タイプのコードです)

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

そして、基準を設定します。

    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'

完了するまで実行され、そのカテゴリコードを持つ行が返されます。

それをしたくない場合は、@ qyb2zm302のメソッド2のように行うことができます。クエリマネージャーの唯一の欠点は、「リスト」の個々の行にそれらを入力する必要があることです。 -一度に25を貼り付けます。

これをCaseステートメントでラップすると、式に直接貼り付けることができます。これは、大きなリストの場合にはるかに適しています。

ソリューション:

上記は私が使ったコードです。簡潔にするために少し単純化していますが、機能します。

  1. リストに手動で入力する限り、[リスト内]はネイティブのクエリマネージャーオプションを介して機能します

  2. D.CATEGORY_CD = '005-00'または、Caseステートメントでラップしている限り機能します

  3. D.CATEGORY_CD IN( '015-00'、 '015-06'、 '015-10'、 '615-07')は、Caseステートメントでラップする限り機能します

  4. PeoplesoftはSmartQuotesを嫌っています。Wordから直接引用符をコピーしている場合、上記のいずれも機能しませんが、保存して終了し、編集モードで同じクエリに戻らない限り、引用符は表示されません。

  5. フォーマットは重要です。ReneとWayneが指摘しているように、上記のすべてには適切なコンマ/引用符のフォーマットが必要です。意味:('xxx-xx'、'xxx-01'、'xxx-02')など

これを手伝ってくれたみんなに感謝します!私はこれまでどんな質問でもこれほど一生懸命に頭を悩ませたことはないと思いますが、それは学習プロセスの一部だと思います。投稿されたすべての回答は有効で正しい(または、より大きな「正しい」の少なくとも一部)ので、すべてにフラグを立てます。

于 2012-08-14T18:14:45.300 に答える
1

The

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

一部は私には怪しいように見えます

文字列内のa''は単一に「評価」されるため'、最初の文字列は

'015-00,'' '

続いて(文字列以外)

015-06,

以下''は、パーサーがかなり無意味であるために偶然見つけたものです。

編集してみてくださいD.CATEGORY_CD IN ('015-00', '015-06', '015-10', '615-07')

于 2012-01-10T21:05:42.463 に答える
0

あなたが投稿したリンクをたどると、あなたが達成しようとしていることを行うための2つの方法がわかります。また、3番目の方法を試したことにも気づきました。

  • 方法1

    • 基準>基準を追加
    • 式の種類:文字
    • 長さ:255
    • 式テキスト:D.CATEGORY_CD IN( '015-00'、 '015-06'、 '015-10'、 '615-07')AND 1
    • 条件タイプ:等しい
    • 定数:1
  • 方法2

    • 基準>基準を追加
    • フィールド:D.CATEGORY_CD
    • 条件タイプ:リスト内
    • 値:015-00'、' 015-06'、' 015-10'、' 615-07
  • 方法3(あなたの方法)

    • 基準>基準を追加
    • フィールド:D.CATEGORY_CD
    • 条件タイプ:等しい
    • 式の定義:「015-00」またはD.CATEGORY_CD IN(「015-00」、「015-06」、「015-10」、「615-07」)

質問)以下は、[式]ボックスに入力するテキストと正確に一致していますか?

'015-00'またはD.CATEGORY_CDIN( '015-00'、 '015-06'、 '015-10'、 '615-07')

そうでない場合、あなたはその箱に何を入れていますか?

于 2012-04-09T19:20:37.587 に答える
0

D.CATEGORY_CD基準が問題を引き起こしていると思います。二重引用符を一重引用符に変更しましたが、それでも私には奇妙に見えました。次に、コンマが引用符の間にあり、引用符の間にないことに気付きました。1つの基準行を次のように表示してみてください。

前:

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

後:

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

また、「IN」は暗黙の「OR」であり、2つのD.CATEGORY_CDを括弧で囲んでいるかどうかはわかりません。追加のコードを、IN基準に入れて、「D.CATEGORY_CD=」行を削除します。 :

前:

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

後:

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

もちろん、すでにCATEGORY_CDで注文しているので、この条件を削除してすべてのカテゴリを1回の実行でプルできます(つまり、Excelに行が多すぎる場合を除く)。次に、VENDOR_IDまたはNAME1のいずれかをORDERに含めることもできます。 BY句。

それがあなたを助けることを願っています。

于 2012-01-12T02:11:58.033 に答える