返回值PL / SQL函数

时间:2019-08-22 03:14:20

标签: oracle plsql sql-function

我尝试创建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
   ;

1 个答案:

答案 0 :(得分:0)

将所有问题放入函数中,如下所示:

  1. P_ID被声明并直接在查询中使用,而无需对其进行初始化。表示P_ID为null,这将限制第一个查询以产生任何结果。因此,v_po_loc_txt将为空。 (我认为pda.project_id是PK,并且不包含NULL。
  2. IF (p_id != 'NULL') THENP_ID是数字,不能像这样进行比较。您应该使用IF P_ID IS NOT NULL THEN
  3. N_ORG_IDN_PO_HEADER_ID甚至都没有声明和初始化。
  4. 此外,您不能使用函数返回2个值。函数将始终返回第一个值。即v_po_loc_txt,如第1点所述,该值始终为NULL。

请更正所有问题,然后重试。

主要,问题是未初始化的P_ID

干杯!