2017-08-29 70 views
0
create or replace PROCEDURE SEC_YIELD_DOD_COMPARE_RPT(
    -- IN parameters 
    reportingDate    IN DATE, 
    P_PORTFOLIO_ID   IN NUMERIC, 
    HOLDING_SECURITY_ID_PARAM IN VARCHAR2, 
    derYieldCalcEngineCd  IN VARCHAR2, 
    -- OUT for INSTRUMENT 
    INSTRUMENT_CUR OUT SYS_REFCURSOR, 
    -- OUT for PORTFOLIO 
    PORTFOLIO_CUR OUT SYS_REFCURSOR) 
AS 
    instrument_sids instrument_sids_table := instrument_sids_table(); 
    portfolio_sids portfolio_sids_table := portfolio_sids_table(); 
    queryPortfolio VARCHAR2(1500); 
    queryInstrument VARCHAR2(1500); 
    queryComplement VARCHAR2(1500); 
BEGIN 

    queryPortfolio:=' SELECT PORTFOLIO_SIDS_RECORD(c1, c2, c3) 
      FROM 
      (SELECT PHS.PORTFOLIO_SID AS c1, 
       NULL     AS c2, 
       PHS.TRADABLE_ENTITY_SID AS c3 
      FROM PORTFOLIO_HOLDING_SNAPSHOT PHS 
      INNER JOIN PORTFOLIO P  
      ON P.PORTFOLIO_SID = PHS.PORTFOLIO_SID 
      INNER JOIN TRADABLE_ENTITY TE 
      ON PHS.TRADABLE_ENTITY_SID = TE.TRADABLE_ENTITY_SID 
      INNER JOIN INSTRUMENT I 
      ON TE.INSTRUMENT_SID = I.INSTRUMENT_SID 
      INNER JOIN TRADABLE_ENTITY_SNAPSHOT TES 
      ON TE.TRADABLE_ENTITY_SID  = TES.TRADABLE_ENTITY_SID 
      WHERE PHS.REPORTING_DT=:1 
      AND TES.REPORTING_DT=:2 
      AND P.CALCULATE_SEC_YIELD_IND = ''Y'')'; 

    queryInstrument:='SELECT INSTRUMENT_SIDS_RECORD(INSTRUMENT_SID, TRADABLE_ENTITY_SID) 
     FROM 
      (SELECT DISTINCT TE.INSTRUMENT_SID, 
      TE.TRADABLE_ENTITY_SID 
      FROM TRADABLE_ENTITY TE 
      INNER JOIN PORTFOLIO_HOLDING_SNAPSHOT PHS 
      ON PHS.TRADABLE_ENTITY_SID = TE.TRADABLE_ENTITY_SID 
      INNER JOIN PORTFOLIO P 
      ON PHS.PORTFOLIO_SID = P.PORTFOLIO_SID 
      INNER JOIN INSTRUMENT I 
      ON TE.INSTRUMENT_SID = I.INSTRUMENT_SID 
      INNER JOIN TRADABLE_ENTITY_SNAPSHOT TES 
      ON TE.TRADABLE_ENTITY_SID  = TES.TRADABLE_ENTITY_SID 
      WHERE P.CALCULATE_SEC_YIELD_IND = ''Y'' 
      AND PHS.REPORTING_DT = :1 
      AND TES.REPORTING_DT = :2)'; 
    -- Populate instrument IDs -- 

     IF P_PORTFOLIO_ID IS NOT NULL THEN 
     IF HOLDING_SECURITY_ID_PARAM IS NOT NULL THEN 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       -- P_PORTFOLIO_ID AND HOLDING_SECURITY_ID_PARAM AND derYieldCalcEngineCd 
       queryComplement:=' AND P.PORTFOLIO_ID=:3 AND PHS.HOLDING_SECURITY_ID =:4 AND TES.DER_YIELD_CALC_ENGINE_CD = :5'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
      ELSE 
       -- P_PORTFOLIO_ID AND HOLDING_SECURITY_ID_PARAM 
       queryComplement:=' AND P.PORTFOLIO_ID=:3 AND PHS.HOLDING_SECURITY_ID =:4'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM; 
     END IF; 
     ELSE 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       -- P_PORTFOLIO_ID AND derYieldCalcEngineCd 
       queryComplement:=' AND P.PORTFOLIO_ID=:3 AND TES.DER_YIELD_CALC_ENGINE_CD = :4'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, derYieldCalcEngineCd; 
      ELSE 
       -- reportingDate, P_PORTFOLIO_ID 

       queryComplement:=' AND P.PORTFOLIO_ID=:3'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID; 
      END IF; 
     END IF; 

    ELSE 
     --FUND NUMBER IS NULL 
     IF HOLDING_SECURITY_ID_PARAM IS NOT NULL THEN 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       --HOLDING_SECURITY_ID_PARAM and derYieldCalcEngineCd , NO FUND NUMBER 
       queryComplement:=' AND PHS.HOLDING_SECURITY_ID =:3 AND TES.DER_YIELD_CALC_ENGINE_CD = :4'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
      ELSE 
       --ONLY HOLDING_SECURITY_ID_PARAM 
       queryComplement:=' AND PHS.HOLDING_SECURITY_ID =:3 '; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM; 
       END IF; 
     ELSE 
     --ONLY derYieldCalcEngineCd 
     IF derYieldCalcEngineCd IS NOT NULL THEN 
      queryComplement:=' AND TES.DER_YIELD_CALC_ENGINE_CD = :3'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate, derYieldCalcEngineCd; 

     ELSE   


     -- ONLY reportingDate 


       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate; 
    END IF; 
    END IF; 
    END IF; 

當我執行這個存儲過程,它顯示我 ORA-00933:SQL命令不能正確地結束 ORA-06512:在 「FAYAODSDEV01.SEC_YIELD_DOD_COMPARE_RPT」行112 ORA-06512:在行14.ORA-00933:SQL命令不能在存儲過程中正確地結束

沒有行缺少分號或任何其他語法的東西。 我懷疑問題出在字符串queryPortfolio或 queryInstrument。

但是,我無法弄清楚確切的問題在哪裏。

由於某種原因,提線數14

有什麼想法? 在此先感謝。

+0

@ vc74,是的。它運作良好。它給了我輸出。 – Sid

+0

我不是很瞭解Oracle,但是你使用':1'到':5',這似乎是參數。但你似乎只是「使用」兩三個值。 –

回答

0
create or replace PROCEDURE SEC_YIELD_DOD_COMPARE_RPT(
    -- IN parameters 
    reportingDate    IN DATE, 
    P_PORTFOLIO_ID   IN NUMERIC, 
    HOLDING_SECURITY_ID_PARAM IN VARCHAR2, 
    derYieldCalcEngineCd  IN VARCHAR2, 
    -- OUT for INSTRUMENT 
    INSTRUMENT_CUR OUT SYS_REFCURSOR, 
    -- OUT for PORTFOLIO 
    PORTFOLIO_CUR OUT SYS_REFCURSOR) 
AS 
    instrument_sids instrument_sids_table := instrument_sids_table(); 
    portfolio_sids portfolio_sids_table := portfolio_sids_table(); 
    queryPortfolio VARCHAR2(1500); 
    queryInstrument VARCHAR2(1500); 
    queryComplement VARCHAR2(1500); 
BEGIN 

    queryPortfolio:='SELECT PORTFOLIO_SIDS_RECORD(c1, c2, c3) 
      FROM 
      (SELECT PHS.PORTFOLIO_SID AS c1, 
       NULL     AS c2, 
       PHS.TRADABLE_ENTITY_SID AS c3 
      FROM PORTFOLIO_HOLDING_SNAPSHOT PHS 
      INNER JOIN PORTFOLIO P  
      ON P.PORTFOLIO_SID = PHS.PORTFOLIO_SID 
      INNER JOIN TRADABLE_ENTITY TE 
      ON PHS.TRADABLE_ENTITY_SID = TE.TRADABLE_ENTITY_SID 
      INNER JOIN INSTRUMENT I 
      ON TE.INSTRUMENT_SID = I.INSTRUMENT_SID 
      INNER JOIN TRADABLE_ENTITY_SNAPSHOT TES 
      ON TE.TRADABLE_ENTITY_SID  = TES.TRADABLE_ENTITY_SID 
      WHERE PHS.REPORTING_DT=:1 
      AND TES.REPORTING_DT=:2 
      AND P.CALCULATE_SEC_YIELD_IND = ''Y'')'; 

    queryInstrument:='SELECT INSTRUMENT_SIDS_RECORD(INSTRUMENT_SID, TRADABLE_ENTITY_SID) 
     FROM 
      (SELECT DISTINCT TE.INSTRUMENT_SID, 
      TE.TRADABLE_ENTITY_SID 
      FROM TRADABLE_ENTITY TE 
      INNER JOIN PORTFOLIO_HOLDING_SNAPSHOT PHS 
      ON PHS.TRADABLE_ENTITY_SID = TE.TRADABLE_ENTITY_SID 
      INNER JOIN PORTFOLIO P 
      ON PHS.PORTFOLIO_SID = P.PORTFOLIO_SID 
      INNER JOIN INSTRUMENT I 
      ON TE.INSTRUMENT_SID = I.INSTRUMENT_SID 
      INNER JOIN TRADABLE_ENTITY_SNAPSHOT TES 
      ON TE.TRADABLE_ENTITY_SID  = TES.TRADABLE_ENTITY_SID 
      WHERE P.CALCULATE_SEC_YIELD_IND = ''Y'' 
      AND PHS.REPORTING_DT = :1 
      AND TES.REPORTING_DT = :2)'; 
    -- Populate instrument IDs -- 

     IF P_PORTFOLIO_ID IS NOT NULL THEN 
     IF HOLDING_SECURITY_ID_PARAM IS NOT NULL THEN 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       -- P_PORTFOLIO_ID AND HOLDING_SECURITY_ID_PARAM AND derYieldCalcEngineCd 
       queryComplement:=' AND P.PORTFOLIO_ID=:3 AND PHS.HOLDING_SECURITY_ID =:4 AND TES.DER_YIELD_CALC_ENGINE_CD = :5'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
      ELSE 
       -- P_PORTFOLIO_ID AND HOLDING_SECURITY_ID_PARAM 
       queryComplement:=' AND P.PORTFOLIO_ID=:3 AND PHS.HOLDING_SECURITY_ID =:4'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, HOLDING_SECURITY_ID_PARAM; 
      END IF; 
     ELSE 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       -- P_PORTFOLIO_ID AND derYieldCalcEngineCd 
       queryComplement:=' AND P.PORTFOLIO_ID=:3 AND TES.DER_YIELD_CALC_ENGINE_CD = :4'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID, derYieldCalcEngineCd; 
      ELSE 
       -- reportingDate, P_PORTFOLIO_ID 

       queryComplement:=' AND P.PORTFOLIO_ID=:3'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate,P_PORTFOLIO_ID; 
      END IF; 
     END IF; 
    ELSE 
     --FUND NUMBER IS NULL 
     IF HOLDING_SECURITY_ID_PARAM IS NOT NULL THEN 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       --HOLDING_SECURITY_ID_PARAM and derYieldCalcEngineCd , NO FUND NUMBER 
       queryComplement:=' AND PHS.HOLDING_SECURITY_ID =:3 AND TES.DER_YIELD_CALC_ENGINE_CD = :4'; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM, derYieldCalcEngineCd; 
      ELSE 
       --ONLY HOLDING_SECURITY_ID_PARAM 
       queryComplement:=' AND PHS.HOLDING_SECURITY_ID =:3 '; 
       queryPortfolio := queryPortfolio || queryComplement; 
       queryInstrument := queryInstrument || queryComplement; 

       EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM; 
       EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate, HOLDING_SECURITY_ID_PARAM; 
      END IF; 
     ELSE 
     --ONLY derYieldCalcEngineCd 
      IF derYieldCalcEngineCd IS NOT NULL THEN 
       queryComplement:=' AND TES.DER_YIELD_CALC_ENGINE_CD = :3'; 
        queryPortfolio := queryPortfolio || queryComplement; 
        queryInstrument := queryInstrument || queryComplement; 

        EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate, derYieldCalcEngineCd; 
        EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate, derYieldCalcEngineCd; 

      ELSE   


      -- ONLY reportingDate 


        EXECUTE IMMEDIATE queryPortfolio BULK COLLECT INTO PORTFOLIO_SIDS USING reportingDate,reportingDate; 
        EXECUTE IMMEDIATE queryInstrument BULK COLLECT INTO INSTRUMENT_SIDS USING reportingDate,reportingDate; 
      END IF; 
     END IF; 
    END IF; 

END;

試試上面的代碼。

您忘記了在程序結束時添加END;

我已經補充說。

它一定會幫助你。

0

我們無法遠程調試動態生成的SQL。這是一個你必須自己解決的問題。

動態SQL很難編碼,也很難調試。主要問題是它將編譯錯誤轉化爲運行時錯誤。但是因爲這個陳述是動態的,所以在找到這個bug之前,沒有任何資源可以挖掘。

但是,您可以通過檢查代碼來簡化自己。放入一些跟蹤語句,最好記錄到表或文件,但如果這是你所有的,則使用dbms_output.put_line()。記錄你下降的分支。記錄生成的SQL語句。即使記錄正在播放的參數。

擁有足夠的信息來理解這個問題是解決問題的至少50%。

相關問題