Stored procedures 如何从pl/sql过程的for循环返回ref_游标

Stored procedures 如何从pl/sql过程的for循环返回ref_游标,stored-procedures,plsql,Stored Procedures,Plsql,我想返回下面sp的参考光标。但它不工作。。没有任何记录。。所以请帮我做这个 数据输入列表-它是两个变量mtn、mtnEffDate的集合类型 DATA_RESULTLIST-它也是3个变量id、effDate、mtn的集合类型 CREATE OR REPLACE PROCEDURE proc1 ( pCustId IN NUMBER, pAcctNo IN NUMBER, pSearchCriteria IN DATA_IN

我想返回下面sp的参考光标。但它不工作。。没有任何记录。。所以请帮我做这个

数据输入列表-它是两个变量mtn、mtnEffDate的集合类型 DATA_RESULTLIST-它也是3个变量id、effDate、mtn的集合类型

 CREATE OR REPLACE PROCEDURE proc1 (
       pCustId  IN  NUMBER,
       pAcctNo    IN    NUMBER,
       pSearchCriteria    IN    DATA_INPUTLIST,
       pRecordSet OUT SYS_REFCURSOR,
       out_error_code   OUT   NUMBER,
       out_error_message   OUT   VARCHAR2
    ) AS

        --Variables
        v_SUN_DATE DATE := TO_DATE('01/15/2011', 'mm/dd/yyyy');
        vCount    NUMBER := 0;
        v_mtn NUM

BER;
    v_mtn_eff_date DATE;
    cMtnPricePlanInfo DATA_RESULTLIST;

BEGIN

    SELECT COUNT(*) INTO vCount FROM TABLE (pSearchCriteria);

    FOR i IN 1..vCount LOOP

        SELECT MTN, TO_DATE(MTN_EFF_DATE, 'mm/dd/yyyy') into v_mtn, v_mtn_eff_date 
        FROM TABLE (pSearchCriteria) 
        WHERE 
        ROWNUM = i; 

        SELECT 
            A.PPLAN_ID, A.EFF_DATE, A.MTN INTO cMtnPricePlanInfo(i).PPLAN_ID, cMtnPricePlanInfo(i).EFF_DATE, cMtnPricePlanInfo(i).MTN
        FROM CUST_ACCT_LINE_PPLAN A, CUST_ACCT_LINE_PPLAN_HIST B
        WHERE
            A.CUST_ID  = pCustId
            AND A.ACCT_NO    = pAcctNo
            AND A.MTN = v_mtn
            AND A.MTN_EFF_DATE = v_mtn_eff_date
            AND A.EFF_DATE >= 
                (SELECT MAX(EFF_DATE) FROM CUST_ACCT_LINE_PPLAN_HIST C
                WHERE
                    C.CUST_ID  = pCustId
                    AND C.ACCT_NO    = pAcctNo
                    AND C.MTN = v_mtn
                    AND C.MTN_EFF_DATE = v_mtn_eff_date
                    AND C.EFF_DATE <= v_SUN_DATE)
            AND A.CUST_ID = B.CUST_ID
            AND A.ACCT_NO = B.ACCT_NO
            AND A.MTN = B.MTN
            AND A.MTN_EFF_DATE = B.MTN_EFF_DATE
            AND A.PPLAN_ID = B.PPLAN_ID;

    END LOOP;
       OPEN pRecordSet FOR
            SELECT * FROM TABLE (cMtnPricePlanInfo);

END;
/

我首先想到的是:

    SELECT MTN, TO_DATE(MTN_EFF_DATE, 'mm/dd/yyyy') into v_mtn, v_mtn_eff_date 
    FROM TABLE (pSearchCriteria) 
    WHERE 
    ROWNUM = i; 
因为i大于1,这不会返回任何内容。有关原因,请参见。事实上,因为您正在使用SELECT。。。进入…,如果i大于或等于2,则会出现“未找到数据”错误

您不需要SQL查询就可以从PL/SQL集合中获取一些值。尝试将此查询替换为

    v_mtn := pSearchCriteria(i).MTN;
    v_mtn_eff_date := TO_DATE(pSearchCriteria(i).MTN_EFF_DATE, 'mm/dd/yyyy');

我没有你的表,也没有你的数据,所以我不能确定你为什么没有数据。我只能冒险提出一些显而易见的建议:vCount是零吗?如果为v_mtn和v_mtn_eff_date输入合适的值,并独立于此存储过程运行查询,它是否返回任何行?

afaik proc不会返回需要使用的值fns@Satya:程序可以有OUT参数。我怀疑发问者打算通过OUT参数从程序中“返回”。对了,萨蒂亚!我正在使用OUT参数,但当前在此游标中未获取任何记录****pRecordSet系统\u REFCURSOR***@rgautam11:你能说是什么解决了你的问题吗?如果其他人和你有同样的问题,并且遇到了这个问题,知道是什么为你解决了这个问题也会对他们有所帮助。