要实现这样一个功能,即输入开始时间和截止时间,动态生产这样的一个表:
开始时间2003,截止时间2005,生产的表只有一列:
时间:
2003
2004
2005该怎么做啊?看了一个网友给的提示,不是很明白!他给的意见:建立一个函数fn('2003','2005'),该函数就是返回这个时间段中的每一年。
然后:select * from table(fn(('2003','2005')),
他还给了截图。但是对于这个语句select * from table(fn(('2003','2005')),我不理解,from后面直接就是table关键字,也没有具体表,谁能帮我解释一下。还有这个函数fn('2003','2005')该如何写啊?那个网友因为有事,这几天都不在,而我又急着需要解决这个问题。拜托了!

解决方案 »

  1.   

    select 2003 + rownum - 1 from dual
    connect by rownum <= 2005 - 2003 + 1;from后面那个table关键字是将函数返回的结果转换为表类型,因为select from只能从表中取数据
      

  2.   

    select 2003 + rownum - 1 from dual 
    connect by rownum <= 2005 - 2003 + 1; 这个思路是我原来做的,主要是想了解下fn('2003','2005')这个函数该如何写?刚开始用pl/sql编程,很菜!fn('2003','2005')返回值应该是什么类型才可以转换成table?
      

  3.   

    http://space.itpub.net/67668/viewspace-604908函数里面的实现其实还是用到connect by的吧
      

  4.   


    如果根据输入的参数,譬如2003,和2005,来产生一个数组,不就能避免connect by了么?还没有试验。明天再弄了,如果成功再来回复,呵呵
      

  5.   

    能帮忙讲讲这个语句吗 我有点看不太明白
    1、
    SQL> select 2003 + rownum - 1 from dual ;2003+ROWNUM-1
    -------------
             2003只有一条记录 加了个CONNECT BY怎么就查出了3条呢?2、
    SQL> select 2003 + rownum - 1 from dual
      2  where rownum <= 3;2003+ROWNUM-1
    -------------
             2003
    试了下用WHERE是不行的3、
    我只理解CONNECT BY和START WITH连用时候的功能
    这里光是用个CONNECT BY就看不太懂了
      

  6.   

    CONNECT BY在这里就是起递归调用的作用,让记录重复,在满足条件时将值换为下一个继续执行。
    相当于:
    while ( i < 3 ){
    result = 2003 + i - 1;
    i ++;
    }select 2003 + rownum - 1 from dual 
    connect by 1=1 and rownum <= 2005 - 2003 + 1; 
    这样写应该也是可以的
    去掉connect by后,就只剩下一条记录了。
      

  7.   


    可以了。
    create or replace type noarray as varray(20) of varchar2(30);create or replace function getArrayTest(year1 int,year2 int) return noarray
    as
      yearresult noarray:=noarray();
    begin
    for i in year1..year2 loop
      yearresult.extend;
      yearresult(yearresult.count):=TO_CHAR(i);
    end loop;
    return yearresult;
    end;
    select *  from table(getarraytest(2005,2008))f;就可以了,但是这种情况,我怎么使用别名啊?
      

  8.   

    (select *  from table(getarraytest(2005,2008))) t_alis这样可以吗
      

  9.   


    我想给查询到的第一列给个别名,咋给啊?
    如果是固定的表,譬如test表的no列:
    select test.no as "编号" from test;就可以了
    但是现在的情况是这种动态表,该怎么给他的第一列用个别名呢?
      

  10.   

    SQL> select COLUMN_VALUE aaa  from table(getarraytest(2005,2008))f;AAA
    ------------------------------
    2005
    2006
    2007
    2008