【问题标题】:PL/SQL Procedure on APEX - Issue with initializationAPEX 上的 PL/SQL 过程 - 初始化问题
【发布时间】:2016-12-25 09:28:40
【问题描述】:

我创建了一个链接到 APEX 以关闭 PO 的程序。目前,当我尝试关闭 PO 时,我的消息日志表中有一条错误消息。错误似乎与初始化有关。

下面是过程

CREATE OR REPLACE PROCEDURE APEX_EBS_EXTENSION.CLOSE_PO (P_FILE_NAME IN 

VARCHAR2)
as
x_action constant varchar2(20) := 'CLOSE'; 
x_calling_mode constant varchar2(2) := 'PO';
x_conc_flag constant varchar2(1) := 'N';
x_return_code_h varchar2(100);
x_auto_close constant varchar2(1) := 'N';
vn_user_id NUMBER ;
vn_resp_id NUMBER :=51058 ;
vn_app_id  NUMBER :=201;
x_origin_doc_id number;
x_returned boolean;
--PRAGMA AUTONOMOUS_TRANSACTION;

vr_message_detail MESSAGE_LOG%rowtype ;

vc_message varchar2(4000);




CURSOR c_po_details IS
SELECT XPTS.ORGANISATION_ID, XPTS.PO_HEADER_ID,XPTS.PO_NUMBER, XPTDS.PO_LINE_ID, XPTS.SHIP_ORGANISATION_ID, XPTS.ITEM_ID
           ,XPTS.DOCUMENT_SUBTYPE, XPTS.DOC_TYPE_CODE, XPTS.TYPE_LOOKUP_CODE,XPTS.ID , XPTS.ITEM_NUMBER,XPTS.USER_ID
FROM xx_po_toclose_stg1 XPTS,
     XX_PO_TOCLOSE_DET_STG  XPTDS
WHERE XPTS.SEQ = XPTDS.SEQ_NO
AND XPTS.USER_ID     = V('APP_USER')
and XPTS.filename = P_FILE_NAME ;


--where po_number = '1000327';

begin

/*
select fnd.user_id , 
       fresp.responsibility_id, 
       fresp.application_id  into user_id, resp_id ,resp_appl_id 
from   fnd_user@BI_APPS fnd ,  fnd_responsibility_tl@BI_APPS fresp
where  fnd.user_name = 'SYSADMIN' 
and  fresp.responsibility_name = 'System Administrator'
and fresp.language='US' ;


select fnd.user_id , 
       fresp.responsibility_id, 
       fresp.application_id  into l_user_id, l_resp_id ,l_resp_appl_id 
from   fnd_user@BI_APPS fnd ,  fnd_responsibility_tl@BI_APPS fresp
where  fnd.user_name ='APEX_IR_USER'
AND SYSDATE BETWEEN start_date and NVL(end_date,'31-dec-4712');

   EXCEPTION 
            WHEN OTHERS THEN  
            DBMS_OUTPUT.PUT_LINE('Exception');
                l_user_id := -1;
              l_resp_id := -1;
               l_resp_appl_id := -1;

fnd_global.apps_initialize@BI_APPS (user_id => -1,
resp_id => 20866,
resp_appl_id => 101);

*/

vc_message := 'CALLING THE USER ID' ;

  SELECT FND.USER_ID 
       INTO vn_user_id
        FROM FND_USER@BI_APPS FND
         WHERE FND.USER_NAME = 'CLOSEPO_USER' ;



/*
--working
fnd_global.apps_initialize@BI_APPS (user_id => 5930,
resp_id => 50295,
resp_appl_id => 201);
*/

vc_message := 'PASSING PARAMETERS IN THE VARIABLES' ;
            fnd_global.apps_initialize@BI_APPS(user_id =>2452 ,
                         resp_id =>  50771,
                        resp_appl_id => 201);



vc_message := 'LOOPING' ;

for po_head in c_po_details LOOP

    --mo_global.init@BI_APPS  (po_head.doc_type_code);
    --mo_global.set_policy_context@BI_APPS  ('S', po_head.org_id_po);

    DBMS_OUTPUT.PUT_LINE ('Calling PO_Actions.close_po for Closing/Finally Closing po number =>'|| po_head.PO_NUMBER);

    x_returned :=
    po_actions.close_po@BI_APPS (
    p_docid => po_head.po_header_id,
    p_doctyp =>po_head.doc_type_code,
    p_docsubtyp =>po_head.document_subtype,
    p_lineid => po_head.PO_LINE_ID,
    p_shipid => NULL,
    p_action => x_action,
    p_reason => 'Close Purchase Order On'||SYSDATE,
    p_calling_mode => x_calling_mode,
    p_conc_flag => x_conc_flag,
    p_return_code => x_return_code_h,
    p_auto_close => x_auto_close,
    p_action_date => SYSDATE,
    p_origin_doc_id => NULL);

    IF x_returned = TRUE THEN

    DBMS_OUTPUT.PUT_LINE ('Item Number which just got Closed/Finally Closed is '||po_head.PO_NUMBER);
    commit;

                        vr_message_detail.message_type := 'E' ;
                        vc_message := vc_message || ' -SqlCode- ' || sqlcode || ' -SqlErrMsg- ' || sqlerrm ;
                        vr_message_detail.message_descr_long := vc_message ;
                        vr_message_detail.message_descr := substr(vc_message, 1, 4000) ;
                        LOG_MESSAGE(vr_message_detail);

vc_message := 'Updating the Remarks Column in xx_po_toclose_stg1 if success' ;

    UPDATE xx_po_toclose_stg1 A
    SET A.REMARKS = 'PO Number' ||'  '||po_head.PO_NUMBER||'  '|| 'with item number '||'  '||po_head.ITEM_NUMBER||'  ' ||'has been closed  by'||'  '||po_head.USER_ID||'  '||'on'||'  '||sysdate
    WHERE A.ID = po_head.ID;

    COMMIT;

    vc_message := 'Updating the STATUS Column in xx_po_toclose_stg1 if success' ;
     --UPDATE STATUS ON FINAL TABLE 
    vc_message := 'Updating the Status Column in xx_po_toclose_stg1 ' ;
    UPDATE xx_po_toclose_stg1 A
    SET A.STATUS = x_action
    WHERE A.ID = po_head.ID;

  COMMIT;



    ELSE

    DBMS_OUTPUT.PUT_LINE ('API Failed to Close/Finally Close line ');

    vc_message := 'Updating the Remarks Column in xx_po_toclose_stg1 if failure' ;

    UPDATE xx_po_toclose_stg1 A
    SET A.REMARKS = 'API Failed to Close/Finally Close the Item number'
    WHERE A.ID = po_head.ID;
    COMMIT;

     vc_message := 'Updating the STATUS Column in xx_po_toclose_stg1 if failure' ;
     --UPDATE STATUS ON FINAL TABLE 
    vc_message := 'Updating the Status Column in xx_po_toclose_stg1 ' ;
    UPDATE xx_po_toclose_stg1 A
    SET A.STATUS = 'FAILED'
    WHERE A.ID = po_head.ID;

    END IF;





    COMMIT;

END LOOP;


EXCEPTION
    WHEN OTHERS THEN

        vr_message_detail.message_type := 'E' ;
        vc_message := vc_message || ' -SqlCode- ' || sqlcode || ' -SqlErrMsg- ' || sqlerrm ;
        vr_message_detail.message_descr_long := vc_message ;
        vr_message_detail.message_descr := substr(vc_message, 1, 4000) ;
        LOG_MESSAGE(vr_message_detail);


END CLOSE_PO;
/

错误信息是“CALLING THE USER ID -SqlCode- 100 -SqlErrMsg- ORA-01403: no data found”

以下是应该触发此消息的程序部分

vc_message := 'CALLING THE USER ID' ;

  SELECT FND.USER_ID 
       INTO vn_user_id
        FROM FND_USER@BI_APPS FND
         WHERE FND.USER_NAME = 'CLOSEPO_USER' ;

下面是初始化部分

vc_message := 'PASSING PARAMETERS IN THE VARIABLES' ;
            fnd_global.apps_initialize@BI_APPS(user_id =>2452 ,
                         resp_id =>  50771,
                        resp_appl_id => 201);

我正在使用在实例上创建的用户 (CLOSEPO_USER) 的用户 ID。使用的责任 ID 用于 PO。

如果有人能指导我解决这个问题,我将不胜感激,以便我可以调试和解决这个问题。

【问题讨论】:

  • 这是您正在使用的 Oracle eBusiness Suite - 它使用具有各种条件的 VPD,因此您的会话必须与预期值匹配。例如,一个常见问题是您的会话具有与 eBus 预期不同的userenv('LANG')

标签: oracle oracle11g oracle-sqldeveloper oracle-apex


【解决方案1】:

ORA-01403 表示查询不返回结果。

在 sqlplus 或 IDE 中运行查询(作为 Apex 应用程序的解析架构):

SELECT FND.USER_ID 
FROM FND_USER@BI_APPS FND 
WHERE FND.USER_NAME = 'CLOSEPO_USER' ;

它可能不返回任何行。解决这个问题,你应该会没事的。

【讨论】:

  • 感谢您的回复。这是我的第一个猜测,但是当我执行查询时,它返回了正确的用户 ID。查询返回一行,用户 ID 为 2452。
  • 查看@Jeffrey Kemp 对您的问题的评论。 VPD 可能会产生干扰。其他步骤:从程序中删除除SELECT ... INTO ... 之外的所有内容。当错误仍然发生时,您可以确定查询没有返回任何行并导致 no_data_found。
  • 谢谢你们。我很欣赏你的cmets。我设法通过添加下面的代码解决了这个问题。 mo_global.init@bi_apps.sunresort.local ('PA'); apps.mo_global.set_policy_context@bi_apps.sunresort.local('S', 401);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 2021-07-16
相关资源
最近更新 更多