当我尝试将值列表粘贴到条件中时,查询会引发 ORA-00907 错误。
背景:我不是开发人员,我只是一个经过充分研究的最终用户,我可以在 Peoplesoft 中使用 PS/Query 编写查询,以用于我公司的实施。我使用 Peoplesoft 的 FSCM 模块(财务和供应链管理),目前版本为 FSCM 8.90.08.024,我认为使用 Oracle 11g 作为基础数据库。
我主要是自学成才,我们的技术专家忙于数据库/应用程序的东西,或者他们不熟悉我部门的特定数据需求。
我应该指出,我无法直接编写 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 是我迄今为止唯一的 SQL 经验,除了 Oracle 的文档和类似这样的网站。根据我的研究,“实际的”SQL 程序员认为它非常受限。对它的限制要求您以违反 SQL 编码最佳实践的方式做事。
查询请求:我有一个查询,我被要求写出针对某些系统定义的类别代码的支出(在凭证和采购订单上)。我要做的是提取凭证 ID,按供应商和类别代码对它们的商品金额求和,然后显示结果。或者换句话说,对于供应商/类别的每个独特组合,将具有该供应商/类别组合的所有优惠券金额相加。
使用 SUM (Fieldname) OVER (PARTITION BY fieldname, fieldname) 语法。
所以最终结果应该看起来像......
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
潜在问题:这工作正常,但一次只能提示一个类别代码。类别代码是 5 位数字,一个 3 位数字的“类别”,后跟一个短划线,然后是一个 2 位数字的“子类别”。我有一个包含 375 个类别代码的列表,我需要获取此查询结果。
我已经在这个版本上设置了一个提示,允许输入通配符(所以 123-%%),但这仍然是大约一百次单独运行的查询。查询管理器允许在条件中使用“列表中”表达式类型,但它需要您手动输入列表中的每个条目。
我正在尝试将其设置为可以将代码列表的纯文本副本粘贴到表达式中的位置,并带有适当的引号/逗号,并让它评估它以给我一个指定的所有 NIGP 代码的组合列表。查询管理器创建的提示字段不允许粘贴列表(据我所知)。
尝试的解决方案:我查看了位于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 错误的原因。有没有人遇到过这个问题?巨大的文字墙,我知道。我很抱歉。这是我在这里的第一篇文章,我尽量不遗漏任何相关内容。
我已经解决了引发这个问题的直接问题,但该请求只是一个非常大的冰山一角,在某些时候我需要找出一种方法,能够使用查询管理器将纯文本列表粘贴为标准,最好是与分析分组配合得很好。
TL;DR 版本:
使用 Peoplesoft 查询管理器使用 OVER、PARTITION BY 进行分组分析 SUM。当我尝试将列表粘贴到条件中时,它会引发 ORA-00907 错误。
任何帮助将不胜感激。谢谢!