我尝试创建PL / SQL函数以使用“ select”语句记录获取不同的路径,但是无法显示任何记录。我不确定功能是否正确。请帮忙检查一下。谢谢大家
PL / SQL在oracle DB 12C中运行
CREATE OR REPLACE PACKAGE package_gov AS
FUNCTION GOV_LOCATION_TXT (P_ORG_ID NUMBER, P_PO_HEADER_ID NUMBER)
RETURN VARCHAR2 IS
v_po_loc_txt VARCHAR2(200);
BEGIN
BEGIN
SELECT CASE WHEN DEPT_LINE IS NOT NULL AND PRJ_NAME IS NULL
THEN
'GOV\'||TEAM_CODE||'\'||DEPT_LINE||'\'||CUST_NAME||'\'||PO_NUMBER||'\'
WHEN DEPT_LINE IS NOT NULL AND PRJ_NAME IS NOT NULL
THEN 'GOV\'||TEAM_CODE||'\'||DEPT_LINE||'\'||CUST_NAME||'\'||PRJ_NAME||'\'||PO_NUMBER||'\'
END ABC_TEXT
INTO v_po_loc_txt
FROM (SELECT DISTINCT po.SEGMENT1 PO_NUMBER,
po.ORG_ID,
sup.VENDOR_NAME CUST_NAME,
po.ATTRIBUTE14 DEPT_LINE,
po.ATTRIBUTE15 TEAM_CODE,
(SELECT pap.segment1
FROM pa_projects_all pap
WHERE pda.project_id = pa.project_id
) PRJ_NAME,
FROM APPS.PO_HEADERS_ALL po,
APPS.ap_suppliers sup,
APPS.PO_DISTRIBUTIONS_ALL pda
WHERE po.VENDOR_ID = sup.VENDOR_ID
AND po.po_header_id = pda.po_header_id
AND pda.project_id = p_id
AND po.ORG_ID = P_ORG_ID
AND po.po_header_id = P_PO_HEADER_ID )
;
END;
RETURN v_po_loc_txt;
END;
END package_gov;
对于实际结果为“ GOV \ BS \ AC \ ABC company ltd \ 12345678”或“ GOV \ BS \ AC \ ABC company ltd \ P-12345 \ 12345678”
sql回答如下: 1. GOV \ BS \ AC \ ABC company ltd \ 12345678 2. GOV \ BS \ AC \ ABC company ltd \ P-12345 \ 12345678
然后,我尝试编写测试脚本来调用该函数,但无法显示任何记录。
SELECT 'DEPT:\' || package_gov.GOV_LOCATION_TXT(po.org_id,
po.po_header_id) ||
' mdir ' ||
'B:\' ||
package_gov.GOV_LOCATION_TXT(po.org_id, po.po_header_id)
FROM apps.po_headers_all po
WHERE 1=1
and last_update_date > sysdate - 360
and package_gov.GOV_LOCATION_TXT(h.org_id, h.po_header_id) is not null
;
答案 0 :(得分:0)
将所有问题放入函数中,如下所示:
P_ID
被声明并直接在查询中使用,而无需对其进行初始化。表示P_ID
为null,这将限制第一个查询以产生任何结果。因此,v_po_loc_txt
将为空。 (我认为pda.project_id
是PK,并且不包含NULL。IF (p_id != 'NULL') THEN
。 P_ID
是数字,不能像这样进行比较。您应该使用IF P_ID IS NOT NULL THEN
N_ORG_ID
和N_PO_HEADER_ID
甚至都没有声明和初始化。v_po_loc_txt
,如第1点所述,该值始终为NULL。 请更正所有问题,然后重试。
主要,问题是未初始化的P_ID
。
干杯!