200808010001,
200808010002,
....
200808020001,
200808020002,
...
此sql中传入日期和一个SEQUENCE(SEQ_ID),请问如何上述列功能?

解决方案 »

  1.   

    这种用系列是没办法了,看以前专家们的回复,应该用分析函数over()
    你最好有具体数据,具体实例出来
      

  2.   

    --假设SEQ_ID是你的SEQUENCE
    select to_char(sysdate,'yyyymmdd')||to_char(SEQ_ID.nextval) from dual;
      

  3.   

    20080801   0001
    a          b
    利用字符串截取,然后取max(b)+1可以实现sequence的功能
      

  4.   

    在此sql中我必须用sequence取ID,因为我们的系统里不允许有重复使用序号的情况。
    我觉得这个sql要解决的问题有
    1.用何种方法取到前一天的最大值。
    2.何时跨到第二天,即序列重新置为的时机,
      

  5.   

    那你定个job;每天凌晨0点0分执行下面的语句,重建sequence,这样每天就不重复了
    drop sequence seq_id;
    create sequence SEQ_ID
    minvalue 1
    maxvalue 99999
    start with 1
    increment by 1
    cache 20;取当天最大值:
    select seq_id.currval from dual
      

  6.   

    给oracle用户授drop sequence的权限实在太危险。
      

  7.   

    用分析函数吧,比用序列的方法简单多了   ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY employee_id)
      

  8.   

    不是授权给用户,而是你自己在数据库上建立一个JOB
      

  9.   


    执行job是要写存储过程的,而在过程里执行drop和create sequence,必须要给oracle用户授权,不可能给他开放oacle 的dba权限的。
      

  10.   

    假如有表如下:
    create table seq_x
    (seq_no number(12));生成seq_no的SQL语句如下:
    select
    decode(nvl(max(seq_no),0),
    0,to_number(to_char(sysdate,'yyyymmdd')) * 10000 + 1,max(seq_no) + 1) seq_no
    from seq_x
    where floor(seq_no/10000) = to_number(to_char(sysdate,'yyyymmdd'));
     如果数据表中存在当天的数据则取值 max(seq_no) + 1
    否则取值 to_number(to_char(sysdate,'yyyymmdd')) * 10000 + 1
    红色10000表示你序列号位数,可以更改。
      

  11.   

    select nvl(max(ID),0) into v_max_id
    from temp
    where temp_date = arg_date and ID = arg_id
    用v_max_id + 1不就是你要的结果吗
      

  12.   


    select youdate||'000'||rn
    from(
    select row_number() over(order by <日期列> desc nulls last) rn,--日期列是null的排在最后
           <日期列> youdate
    from test)上面那个比较初级因为000写死了是3个0youdate||lpad(rn,4,'0') --位数是4,不足4位左边补0
      

  13.   

    用存储过程
    每天0点都把该seq drop掉 然后建立;
    在里面调用序列,用to_char(sysdate,'yyyy-mm-dd')||seq来拼接;