2011-06-21 92 views
0

在下面的oracle sql包體中,我收到「SQL Statement ignored」錯誤,無法確定原因。請參閱dborLoans_cursor的SELECT語句中PROCEDUREupdateLoansInLdcTab在下面的語句:存儲過程中的光標問題

create or replace 
PACKAGE body PK_DBORUFT_SYNC AS 
PROCEDURE mainProg(v_beginDate DATE, v_endDate DATE) IS 
BEGIN 
    updateLoansInLdcTab(v_beginDate,v_endDate); 
END mainProg; 

FUNCTION searchForLdcToUpdate(v_beginDate DATE, v_endDate DATE) RETURN type_ref_cursor IS 
    v_ldcLoan type_ref_cursor; 
BEGIN 
    DBMS_OUTPUT.ENABLE(1000000); 
    OPEN v_ldcLoan FOR 
     SELECT loan_id 
     FROM ldc.ldc_rel_tab 
     WHERE loan_id NOT IN 
       (SELECT loan_id 
       FROM dbor.vw_ldc_data dbor 
       WHERE dbor.closing_agent  IS NOT NULL 
          AND dbor.closing_agent_phone IS NOT NULL 
          AND dbor.lock_expiration_date > sysdate) 
        AND TO_CHAR(request_date, 'MM/DD/YYYY') >= v_beginDate 
        AND TO_CHAR(request_date, 'MM/DD/YYYY') <= v_endDate; 

    RETURN v_ldcLoan; 
END searchForLdcToUpdate; 

PROCEDURE updateLoansInLdcTab(v_beginDate DATE, v_endDate DATE) is 
TYPE dborLdcData IS TABLE OF dbor.vw_ldc_data%ROWTYPE; 
v_ldcLoan_type_rec type_ref_cursor; 
    v_ldcLoanCursor_type ldcLoanCursor_type; 
dborReference   dborLdcData; 
v_LDC_LOANID   VARCHAR2(10); 
    v_LOAN_ID       VARCHAR2(10); 
v_BANKLINE       VARCHAR2(20); 
    v_CHANNEL       VARCHAR2(20); 
    v_PROPERTY_TYPE     VARCHAR2(10); 
    v_STATE         VARCHAR2(2); 
    v_STREET_NAME     VARCHAR2(64); 
    v_FIRST_NAME      VARCHAR2(64); 
    v_LAST_NAME       VARCHAR2(64); 
    v_CLOSING_AGENT     VARCHAR2(50); 
    v_CLOSING_AGENT_PHONE VARCHAR2(15);   
v_REGION_CODE   VARCHAR2(20);   
v_CLPP_FLAG    VARCHAR2(1);   
v_INSTRUMENT_NAME  VARCHAR2(30);   
v_BROKER_OFFICER  VARCHAR2(30);   
v_COST_CENTER   VARCHAR2(10);   
v_PREPARED_BY   VARCHAR2(30);   
v_BUYPRICE    NUMBER(9,4);   
v_SRP     NUMBER(8,3);   
v_TOTAL_BUYPRICE  NUMBER(9,4);   
v_TOTAL_SRP    NUMBER(8,3); 
v_BRANCH_NAME     VARCHAR2(30); 
v_LOCK_EFFECTIVEDATE DATE; 
dbor_count    NUMBER; 

    CURSOR dborLoans_cursor IS 
     SELECT P.loan_id, 
       P.property_type, 
       P.state, 
       P.street_name, 
       P.close_date, 
       P.loan_purpose, 
       P.borrower_last_name, 
       P.borrower_first_name, 
       P.closing_agent, 
       P.closing_agent_phone, 
       P.region_code, 
       P.clpp, 
       P.instrument_name, 
       P.broker_officer, 
       P.lock_effective_date, 
       P.channel, 
       NVL(P.buyprice, 0) buyPrice 
     FROM dbor.vw_ldc_data P 
        LEFT JOIN dbor.wlnprogram W 
          ON upper(P.instrument_name) = W.ln_pgm 
        LEFT JOIN 
         (SELECT A.loan_id FROM ldc.ldc_rel_tab A WHERE A.ldc_status='LDC_PENDING' 
         ) pend ON pend.loan_id = p.loan_id 
        LEFT JOIN 
         (SELECT DISTINCT A.loan_id 
         FROM ldc.ldc_rel_tab A, ldc.ldc_request_rel_tab B 
         WHERE A.ldc_status IN ('LDC_PENDING', 'DISBURSED','COMPLETE','RECON_PENDING','SUBMITTED','DISBURSEPAYOFF','VOIDREQUEST','FUNDS_REQUESTED') 
            AND A.ldc_id   = B.ldc_id 
            AND (B.funding_reason = 'DL Payoff' OR B.funding_reason ='Original Disbursement') 
         ) disbursed ON disbursed.loan_Id = p.loan_id 
        LEFT JOIN 
         (SELECT name, phone, agent_id, street1, city, zip, state FROM dbor.WCLOS_AGNT) wagnt 
          ON wagnt.agent_id=p.loan_id 
        LEFT JOIN 
         (SELECT loan, 
             company_name, 
             phone_phn, 
             street, 
             city, 
             zip_code, 
             state 
          FROM DBOR.WLOAN_PARTY 
          WHERE type='4' 
         ) wloan ON wloan.loan =p.loan_id 
      WHERE P.closing_agent  IS NOT NULL 
         AND p.loan_id not in (SELECT loan_id FROM ldc.ldc_rel_tab) 
         AND P.closing_agent_phone IS NOT NULL 
         AND P.lock_expiration_date > sysdate ; 

    v_dborLdcData dbor.vw_ldc_data%ROWTYPE; 

BEGIN 
    DBMS_OUTPUT.ENABLE(1000000); 

    dborReference := dborLdcData(); 
    v_ldcLoanCursor_type := searchForLdcToUpdate(v_beginDate, v_endDate); 
    dbor_count := 0; 



WHILE dborLoans_cursor%FOUND LOOP 
    FETCH dborLoans_cursor INTO v_dborLdcData; 
    dbor_count := dbor_count + 1; 
     v_LOAN_ID := v_dborLdcData.LOAN_ID; 
     v_PROPERTY_TYPE := v_dborLdcData.property_type; 
     v_STATE := v_dborLdcData.state; 
     v_STREET_NAME := v_dborLdcData.street_name; 

     v_LAST_NAME := v_dborLdcData.borrower_last_name; 
    v_FIRST_NAME := v_dborLdcData.borrower_first_name; 
     v_CLOSING_AGENT := v_dborLdcData.closing_agent; 
     v_CLOSING_AGENT_PHONE := v_dborLdcData.closing_agent_phone; 

     v_CLPP_FLAG := v_dborLdcData.clpp; 
     v_INSTRUMENT_NAME := v_dborLdcData.INSTRUMENT_NAME; 
     v_BROKER_OFFICER := v_dborLdcData.BROKER_OFFICER; 
     v_CHANNEL := v_dborLdcData.CHANNEL; 
     EXECUTE IMMEDIATE 'SELECT region_code FROM dbor.Branch WHERE branch_name = '||v_dborLdcData.CHANNEL INTO v_REGION_CODE; 
     EXECUTE IMMEDIATE 'SELECT cost_center FROM ldc.REF_BANKLINE_REL WHERE channel = '||v_dborLdcData.CHANNEL INTO v_COST_CENTER; 
     EXECUTE IMMEDIATE 'SELECT bankline FROM ldc.REF_BANKLINE_REL WHERE channel = '||v_dborLdcData.CHANNEL INTO v_BANKLINE; 
     v_LOCK_EFFECTIVEDATE := v_dborLdcData.lock_effective_date; 
     v_BUYPRICE := v_dborLdcData.buyPrice; 


     LOOP 
    FETCH v_ldcLoan_type_rec INTO v_LDC_LOANID; 
      EXECUTE IMMEDIATE 
    'update ldc.ldc_rel_tabtest 
    set loan_id = ' ||''''|| v_LOAN_ID||''''|| 
     ',bankline = ' ||''''|| v_BANKLINE||''''|| 
      ',channel = ' ||''''||v_CHANNEL||''''|| 
      ',PROPERTY_TYPE= ' ||''''||v_PROPERTY_TYPE||''''|| 
      ',STATE = ' ||''''||v_STATE||''''|| 
      ',STREET_NAME = ' ||''''||v_STREET_NAME||''''|| 
      ',BORROWER_NAME = ' ||''''||v_LAST_NAME||','||''''||v_FIRST_NAME||''''|| 
      ',CLOSING_AGENT = ' ||''''||v_CLOSING_AGENT||''''|| 
      ',CLOSING_AGENT_PHONE = ' ||''''||v_CLOSING_AGENT_PHONE||''''||    
       ',REGION_CODE = ' ||''''||v_REGION_CODE||''''||      
       ',CLPP_FLAG = ' ||''''||v_CLPP_FLAG||''''||      
       ',INSTRUMENT_NAME = ' ||''''||v_INSTRUMENT_NAME||''''||    
       ',BROKER_OFFICER = ' ||''''||v_BROKER_OFFICER||''''||     
       ',COST_CENTER = ' ||''''||v_COST_CENTER||''''||  
       ',BUYPRICE = ' ||v_BUYPRICE || 
    ' where loan_id = ' ||v_LDC_LOANID; 
     END LOOP; 
    END LOOP; 
EXCEPTION 
    WHEN OTHERS 
     THEN 
     DBMS_OUTPUT.PUT_LINE(SQLERRM); 
END updateLoansInLdcTab; 
END PK_DBORUFT_SYNC; 
+0

遊標中的SELECT語句是否獨立運行?如果你可以將這個問題提煉出一個小的失敗案例幷包含完整的錯誤文本,那將會更有幫助。 – DCookie

+0

@DCookie:是,遊標中的SELECT語句確實運行獨立。收到的確切錯誤測試是「錯誤(58,4):PL/SQL:SQL語句被忽略」。 – dionysus

+0

@DCookie:另外,我已經採用了遊標語句並將其添加到匿名塊中,並且它編譯並運行良好。不知道爲什麼它不在包裝中。 – dionysus

回答

1

一瞥之後這(不運行它),我會雖然有對錯誤下面,你還沒有把周圍的值引號線,正在被連接在一起:

EXECUTE IMMEDIATE 'SELECT region_code FROM dbor.Branch WHERE branch_name = '||v_dborLdcData.CHANNEL INTO v_REGION_CODE; 
EXECUTE IMMEDIATE 'SELECT cost_center FROM ldc.REF_BANKLINE_REL WHERE channel = '||v_dborLdcData.CHANNEL INTO v_COST_CENTER; 
EXECUTE IMMEDIATE 'SELECT bankline FROM ldc.REF_BANKLINE_REL WHERE channel = '||v_dborLdcData.CHANNEL INTO v_BANKLINE; 

然而,從你上面的評論似乎已經得到了它的工作。

這段代碼中的更大的問題是爲什麼你要立即使用execute?你不需要,更糟糕的是你創建了不可擴展的代碼,因爲三個執行上面的直接語句,而大的更新沒有使用綁定變量。在PLSQL中,如果你避免使用execute_immediate,你根本不需要擔心綁定,PLSQL會自動爲你做這一切。

嘗試轉換的執行直接選擇到這樣的:

select region_code 
into v_region_code 
from dbor.branch 
where branch_name = v_dborLdcData.CHANNEL; 

,將工作發現和解決綁定變量的問題。然後執行相同的更新:

update ldc.ldc_rel_tabtest 
set loan_id = v_LOAN_ID 
    bankline = v_bank_line 
    ... 
    ... 
where loan_id = v_LDC_LOANID; 

代碼將更簡單,更容易找到SQL中的錯誤並且更具可擴展性。

0

問題是由於缺少DBOR.WLOAN_PARTY上的授權。