说:有12张表,table01到table12。按月查表格,规则如下:例3月份查table02,4月份查table03类推。
    每个表都有字段5个:字段1,字段2,字段3,字段4,字段5,用存储过程怎么写呢?     
     CREATE OR REPLACE PROCEDURE "test1"
      (
        vo_resultcode   OUT NUMBER ,
        vo_resultinfo   OUT VARCHAR2
      )
     IS
        字段1   VARCHAR2(30);
        字段2   VARCHAR2(30);
        字段3   VARCHAR2(30);
        字段4   VARCHAR2(30);
        字段5   VARCHAR2(30);
        v_sql   VARCHAR2(1500);
    BEGIN
        v_sql := ‘SELECT * FROM TABLE’||TO_CHAR(sysdate,‘MM’);
    EXECUTE IMMEDIATE v_sql INTO 字段1,字段2,字段3,字段4,字段5;
请高手帮我看看有没有错呢?谢谢啦,新手求指导。

解决方案 »

  1.   

    修修v_sql如下:
    v_sql := 'SELECT * FROM TABLE' || TO_CHAR(sysdate,'MM') ||
             'INTO 字段1, 字段2, 字段3, 字段4, 字段5';
      

  2.   

    呵呵,调成这样了。比较复杂:
    CREATE OR REPLACE PROCEDURE "zengzhi_xingweimingxi_yi"
     (
     vo_resultcode OUT NUMBER,
     vo_resultinfo OUT VARCHAR2
     )
     IS
    START_DATE  VARCHAR2(8);
    MSISDN      VARCHAR2(15);
    OTHER_PARTY VARCHAR2(30);
    CALL_TYPE   VARCHAR2(2);
    START_TIME  VARCHAR2(20);
    END_TIME    VARCHAR2(20);
    CALL_DURATION INTEGER;
    v_sql       VARCHAR2(1500);
     BEGIN
     v_sql:='SELECT START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss''),''yyyymmdd hh24miss'')
     ,to_char(TO_DATE(START_DATE||'' ''||START_TIME,''yyyymmdd hh24miss'') + CALL_DURATION / 24 / 60 / 60,''yyyymmddhh24miss''),CALL_DURATION FROM TG_CDR'
     ||to_char(add_months(sysdate,-1),'mm');
    EXECUTE IMMEDIATE v_sql INTO START_DATE,MSISDN,OTHER_PARTY,CALL_TYPE,START_TIME,END_TIME,CALL_DURATION;END;我是按别人修改的,用toad运行时候报“OUT is not a valid INTEGER"错误,请问那个
    vo_resultcode OUT NUMBER,
    vo_resultinfo OUT VARCHAR2这两句是在说系统的结果返回吗??不明白是做什么的啊?
      

  3.   

    静态游标使用代码分析
    DECLARE
     v_val PDS.TBIWDENUM.VAL%TYPE;    //获得PDS.TBIWDENUM表中的VAL列的类型信息,并定义变量v_val为该类型
     v_valen PDS.TBIWDENUM.VALEN%TYPE;
      CURSOR c_Infor IS //定义游标指向查询结果集
         SELECT VAL,VALEN
         FROM PDS.TBIWDENUM
         WHERE PARAMETERTYPE =14;
     BEGIN
       OPEN c_Infor; //打开游标
       LOOP //开始循环取结果集中的数据
          FETCH c_Infor INTO v_val,v_valen;  //取游标指向结果集中的一行记录,并将游标指针指向下一行
          EXIT WHEN c_Infor%NOTFOUND;          //判断当前取回的行内容为空
          IF v_val = 64 THEN  //判断数据条件,满足则输出相应信息
             DBMS_OUTPUT.put_line(v_val);
             DBMS_OUTPUT.put_line(v_valen);
             DBMS_OUTPUT.put_line('Find it');
          END IF;
        END LOOP;
        CLOSE c_Infor; //关闭游标,释放资源
     END;
    显示游标仅仅是用来控制返回多行的SELECT语句,而隐式游标是指向处理所有的SQL语句的环境区域的指针,隐式游标也叫SQL游标。
    SQL游标用来处理INSERT、UPDATE、DELETE以及返回一行的SELECT……INTO语句。一个SQL游标不管是打开还是关闭,OPEN、FETCH和CLOSE命令都不能操作。
    游标类型变量使用代码分析
    DECLARE 
     TYPE t_CurRef IS REF CURSOR; //定义一个引用游标类型,但是并没有固定到某一类型上
     c_CursorRef t_CurRef; //定义一个引用游标类型的游标变量 TYPE t_ValenRef IS RECORD( //定义一个用户需要的记录集类型
        Parameter PDS.TBIWDENUM.PARAMETERTYPE%TYPE,
        valen PDS.TBIWDENUM.VALEN%TYPE);
        
     TYPE t_ValRef IS RECORD( //定义一个用户自己的记录集类型
        Parameter PDS.TBIWDENUM.PARAMETERTYPE%TYPE,
        val PDS.TBIWDENUM.VAL%TYPE);
        
        v_Valen t_ValenRef; //根据用户定义的记录集类型定义记录集变量
        v_Val   t_ValRef;
        
     BEGIN
     
       OPEN c_CursorRef FOR  //打开游标,并指向查询结果为t_ValenRef类型的记录集
            SELECT PARAMETERTYPE,VALEN FROM PDS.TBIWDENUM WHERE PARAMETERTYPE =14;
       LOOP 
           FETCH c_CursorRef INTO v_Valen; //获取记录集中的一行数据
           EXIT WHEN c_CursorRef%NOTFOUND;
           DBMS_OUTPUT.put_line(v_valen.Parameter);
        END LOOP;
        CLOSE c_CursorRef;
        
        OPEN c_CursorRef FOR    //打开游标,并指向查询结果为t_ValRef类型的记录集
             SELECT PARAMETERTYPE,VAL FROM PDS.TBIWDENUM WHERE PARAMETERTYPE =14;
        LOOP 
           FETCH c_CursorRef INTO v_Val;
           EXIT WHEN c_CursorRef%NOTFOUND;
           DBMS_OUTPUT.put_line(v_Val.val);
        END LOOP;
        CLOSE c_CursorRef;
     END;
      

  4.   

    create or replace procedure test
    (
      vo_resultcode OUT NUMBER ,
      vo_resultinfo OUT VARCHAR2
    )
    as
      sMonth varchar2(4);
      sPrvMonth varchar2(4);
      sSearchTbl varchar2(30);
      sSql varchar2(2000);
      v_a1 varchar2(30);
      v_a2 varchar2(30);
      v_a3 varchar2(30);
      v_a4 varchar2(30);
      v_a5 varchar2(30);
    begin
      vo_resultinfo := '取出当前服务器时间的月份';
      select to_char(sysdate,'mm') into sMonth from dual;
      vo_resultinfo := '获取当前月份的上一个月';
      if to_number(sMonth) = 1 then
        sPrvMonth := '12';
      else
        if to_number(sMonth) > 10 then
          sPrvMonth := to_Char(to_number(sMonth)-1);
        else
          sPrvMonth := '0'||to_Char(to_number(sMonth)-1);
        end if;
      end if;
      vo_resultinfo := '获取当前月要查询的数据表名';
      sSearchTbl := 'table'||sPrvMonth;
      vo_resultinfo := '获取数据';
      sSql := 'begin
                 select a1,a2,a3,a4,a5 into :1,:2,:3,:4,:5 from '||sSearchTbl||';
               end;';
      execute immediate sSql using out v_a1,v_a2,v_a3,v_a4,v_a5;  --后面的操作LZ没明确指时要做什么。当然这个我也没进行测试  vo_resultcode := 1;
      vo_resultinfo := '成功';
    exception
      when others then
        vo_resultinfo := 'Error';
        vo_resultcode := 0;
    end;
      

  5.   

    上一次搞错了。。在获取数据时。
    create or replace procedure test
    (
      vo_resultcode OUT NUMBER ,
      vo_resultinfo OUT VARCHAR2
    )
    as
      sMonth varchar2(4);
      sPrvMonth varchar2(4);
      sSearchTbl varchar2(30);
      sSql varchar2(2000);
      v_a1 varchar2(30);
      v_a2 varchar2(30);
      v_a3 varchar2(30);
      v_a4 varchar2(30);
      v_a5 varchar2(30);
    begin
      vo_resultinfo := '取出当前服务器时间的月份';
      select to_char(sysdate,'mm') into sMonth from dual;
      vo_resultinfo := '获取当前月份的上一个月';
      if to_number(sMonth) = 1 then
        sPrvMonth := '12';
      else
        if to_number(sMonth) > 10 then
          sPrvMonth := to_Char(to_number(sMonth)-1);
        else
          sPrvMonth := '0'||to_Char(to_number(sMonth)-1);
        end if;
      end if;
      vo_resultinfo := '获取当前月要查询的数据表名';
      sSearchTbl := 'table'||sPrvMonth;
      vo_resultinfo := '获取数据';
      sSql := 'begin
                 select a1,a2,a3,a4,a5 into :1,:2,:3,:4,:5 from '||sSearchTbl||';
               end;';
      execute immediate sSql using out v_a1,out v_a2,out v_a3,out v_a4,out v_a5;  --后面的操作LZ没明确指时要做什么。当然这个我也没进行测试  vo_resultcode := 1;
      vo_resultinfo := '成功';
    exception
      when others then
        vo_resultinfo := 'Error';
        vo_resultcode := 0;
    end;