select priority into v_vpn_priority from djb_tab_vpnprcplnpriority where prcplnid =c1.prcplnid;
        if (v_vpn_priority > 0) then
          rd_prcpln.v_priority := v_vpn_priority;
        end if;
根据上面这个例子:
 select priority into v_vpn_priority from djb_tab_vpnprcplnpriority where prcplnid =c1.prcplnid;1、在执行完select语句,查出来的是一个集合还是一个值??

解决方案 »

  1.   

    补充提问:它是把所有查出来的结果一次都赋值给v_vpn_priority吗??
      

  2.   

    你不是用的游标,所以不会把查询的结果集赋值给v_vpn_priority
      

  3.   

    select priority into v_vpn_priority from djb_tab_vpnprcplnpriority where prcplnid =c1.prcplnid;
     这个查询的是一条记录还是一个数据集?
    如果priority 只是一个列值,并且条件where prcplnid =c1.prcplnid 可以确定查出的只是一条记录的话就是一个值,如果查出来的是多条记录,那就是一个结果集如果是结果集的话,rd_prcpln.v_priority := v_vpn_priority;
    这一句就有问题了。好像需要用循环一条条处理。一般存储过程里都是一条条的处理的。
      

  4.   

    select ...into... from .....
    这种方式为隐式游标,要求返回一个值。如果返回多个值或者没有值,都会产生异常。当然,可以使用集合变量而返回多个值
    SQL> set serveroutput on;
    SQL> 
    SQL> DECLARE
      2    --声明集合类型
      3    TYPE t_arr IS TABLE OF VARCHAR2(20);
      4    --声明集合变量
      5    v_arr t_arr := t_arr();
      6  BEGIN
      7    --给集合变量赋值
      8    SELECT ename BULK COLLECT INTO v_arr FROM emp;
      9    --输出集合并量值
     10    FOR i IN 1 .. v_arr.count LOOP
     11      dbms_output.put_line(v_arr(i));
     12    END LOOP;
     13  END;
     14  /
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLERPL/SQL 过程已成功完成。