问题在cursor上,游标很慢的,可以不用游标吗??

解决方案 »

  1.   

    谢谢两位,不能不用游标,我要实现动态的查询.用PB来调用该存储过程做报表.而且只要将
    str1:='select * from table1';
        open cursor for str1;
    中的str1改为open cursor for select * from table1,则速度很快.
      

  2.   

    open cursor for str1;
    这句应该是
    open l_cursor for str1; 吧?
        
      

  3.   

    lastdrop(空杯),说得对是open l_cursor for str1;
      

  4.   

    那你试试执行下面的匿名块,如果速度不慢说明是决定速度的是PB,而不是存储过程。declare
     l_cursor package1.cursor1;
    begin
     procedure1(l_cursor);
    end;
    /
      

  5.   

    与Lastdrop(空杯)商讨:问题是procedure1里面怎么写,同样要用到动态。再说清楚一点我需要根据传入的参数,查询不同的表。
      

  6.   

    可以用oracle支持的动态sql语法。oracle的官方文当中都有相关例子
      

  7.   

    是这样吗?
    create or replace procedure procedure1(tablename varchar2,l_cursor out package1.cursor1)   
    is
    str1  varchar2(100);
    begin
        str1:='select * from '|| tablename ;
        open l_cursor for str1;
    end;
    /
      

  8.   

    试试使用dbms_sql 语句执行动态sql语句,
      

  9.   

    根据传入的参数,查询不同的表?用动态游标就OK!CREATE OR REPLACE PACKAGE BODY "NB_SUPFIND"
        AS
     
      PROCEDURE RecSel1(
       p_StartDate IN CHAR,
        p_EndDate   IN CHAR,
        p_Region    IN VARCHAR2,   --分区内容
        p_col       IN VARCHAR2,   --选中项目名
        p_table     IN VARCHAR2,   --操作表名
        v_ADDV      OUT myrctype   --作为输出的游标
        ) IS
     
      strsql VARCHAR2(500);
     
        BEGIN
     
               strsql:='SELECT ADDVNM region,YY,SUM('||p_col||') item
                      FROM '||p_table||     
                    ' WHERE YY <= TO_NUMBER('||p_EndDate||') AND YY>=TO_NUMBER('|| p_StartDate||') AND  ADDVNM='''||p_Region||  
                    ''' GROUP BY ADDVNM,YY';
          
           --打开动态游标
         OPEN v_ADDV FOR strsql; 
        END RecSel1;
      

  10.   

    谢谢Strawberry79(草莓) 。但我的问题不是我不会写动态语句,而是,我想加快执行的速度。