1. 程式人生 > >在PL/SQL中呼叫Oracle ERP請求(一)-提交單個請求

在PL/SQL中呼叫Oracle ERP請求(一)-提交單個請求

最近開發一個從PLM系統中通過工作流程向ORACLE ERP系統中匯入專案資訊的程式,Oracle ERP系統有獨立的請求模組,所以這樣我們只需呼叫到ERP模組中的請求即可,由於PLM系統用的是windchill,底層程式碼是JAVA程式,並且從PLM系統中匯出的資料需要經過驗證後才能正式匯入ERP,所以採用了使用JAVA呼叫儲存過程的方式,過程為:

      1. PLM匯出檔案流資料;

      2. PLM系統匯出資料匯入Oracle ERP系統中臨時表;

      3. 驗證臨時表中資料;

      4. 臨時表匯入ERP介面表;

      5. 提交單個請求或請求集。

       下面是如何提交單個請求程式碼,希望對大家有幫助。網路上有些文章在對引數是否作為子請求提交解釋有錯誤,大家在使用時建議多看一下Oracle官方文件,以免使用過程中造成錯誤。

PROCEDURE prc_do_import_request(prm_org     IN NUMBER,
                                  prm_appcode OUT NUMBER,
                                  prm_appmsg  OUT VARCHAR2) IS
    custom_exception EXCEPTION;
    success        BOOLEAN;
    v_request_id   NUMBER;
    v_phase        VARCHAR2(30);
    v_status       VARCHAR2(30);
    v_dev_phase    VARCHAR2(30);
    v_dev_status   VARCHAR2(30);
    v_message      VARCHAR2(1000);
    v_request_flag BOOLEAN;
    v_start_time   VARCHAR2(30);
  BEGIN
    prm_appcode := 0;
    --初始化設定
    fnd_global.apps_initialize(user_id      => global_user_id,--使用者ID
                               resp_id      => global_resp_id,          --責任ID  
                               resp_appl_id => global_resp_appl_id);   --應用ID
    --設定列印引數
    success := fnd_request.set_print_options(printer => global_printer,
                                             style   => global_style,
                                             copies  => global_copies);
    IF NOT success THEN
      RAISE custom_exception;
    END IF;
    v_start_time := to_char(SYSDATE, 'DD-MON-YYYY HH24:MI:SS');
    --呼叫請求
    v_request_id := fnd_request.submit_request('INV',   --應用
                                               'INCOIN',                  --程式
                                               '',                              --程式說明
                                               v_start_time,               --開始時間
                                               FALSE,                        --是否作為子請求提交,該請求如果是被其它請求呼叫設為TRUE,否則為FALSE
                                               prm_org,                    --自定義引數1:組織機構
                                               '1',                             --自定義引數2 :
                                               '1',                             --自定義引數3:
                                               '1',                             --自定義引數4:
                                               '1',                             --自定義引數5:
                                               '1',                             --自定義引數6:
                                               '1',                             --自定義引數7:
                                               chr(0));                       --結束標識
    IF v_request_id = 0 THEN
      RAISE custom_exception;
    ELSE
      COMMIT;
    END IF;
    --等待
    v_request_flag := fnd_concurrent.wait_for_request(request_id => v_request_id,--返回的請求ID
                                                      INTERVAL   => 5,                                     --重複檢測時間差
                                                      max_wait   => 0,                                       --最長等待時間,0為一直等待  
                                                      phase      => v_phase,                                                          
                                                      status     => v_status,
                                                      dev_phase  => v_dev_phase,
                                                      dev_status => v_dev_status,
                                                      message    => v_message);
    IF v_request_flag THEN
      IF v_dev_status = 'NORMAL' THEN
        NULL;
      ELSE
        RAISE custom_exception;
      END IF;
    ELSE
      RAISE custom_exception;
    END IF;
  EXCEPTION
    WHEN custom_exception THEN
      prm_appcode := -1;
      prm_appmsg  := '錯誤提示:匯入ERP正式表出錯!' || SQLERRM;
    WHEN OTHERS THEN
      prm_appcode := -1;
      prm_appmsg  := '錯誤提示:匯入ERP正式表出錯!' || SQLERRM;
  END prc_do_import_request;