ORA-00933:SQL命令未在存储过程中正确结束

时间:2017-08-29 10:19:14

标签: sql oracle stored-procedures

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:at" FAYAODSDEV01.SEC_YIELD_DOD_COMPARE_RPT",第112行 ORA-06512:第14行。

没有一行缺少分号或任何其他语法内容。 我怀疑问题是在字符串queryPortfolio或 queryInstrument。

但是,我无法确定确切问题所在。

由于某种原因,它提到了第14行。

有什么想法? 提前致谢。

2 个答案:

答案 0 :(得分: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;

我添加了。

一定会对你有所帮助。

答案 1 :(得分:0)

我们无法远程调试动态生成的SQL。这是你必须自己解决的问题。

动态SQL难以编码且难以调试。主要问题是它将编译错误转换为运行时错误。但是因为这个陈述是动态的,所以在找到错误之前没有消息来源。

但是,您可以通过检测代码来使自己更轻松。添加一些跟踪语句,最好是记录到表或文件,但如果只有<TextField id="SigninTextfield" label="Aadhaar number" id="Aadhar" lineDirection="center" required={true} type="number" maxLength={12} style={styles.rootstyle} erorText="Please enter only 12 digits number" /> ,则使用dbms_output.put_line()。记录你去哪个分支。记录生成的SQL语句。甚至记录正在播放的参数。

有足够的信息来理解问题至少是解决方案的百分之五十。