| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 806 人关注过本帖
标题:求助ORACLE存储过程,懂的进来帮助,谢
只看楼主 加入收藏
linweihong
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-6-6
收藏
 问题点数:0 回复次数:2 
求助ORACLE存储过程,懂的进来帮助,谢
我有两张表 PDM_Tob     主键:PDM_TobId  
           PDM_Process  主键:Pdm_processid  字段Laminaid(用于存PDM_Top表的PDM_TobId ) 字段FormulaNO

PDM_Tob 有n条数据
现PDM_Process 可能有数据,也可能没数据,且PDM_Process的列FormulaNO数据要求是WW2009000004 ,2009 是当前年年份,000004是流水号。

现需要将PDM_Tob的n条数据插入PDM_Process  

以下是我写的存储过程,但有点错误,请大家帮帮忙,急!!!明天要上机调试。。

create or replace procedure P_LeafProcessSameUpdate
is

v_count int;
v_i int;
v_tag varchar(200);
v_value varchar2(200);
v_len int;

begin
v_i:=1;
select count(*) into  v_count from PDM_Tob  ;   //取出PDM_Tob  具体数据数量

select   FormulaNO   into v_value from PDM_Process
where rownum=1 order by FormulaNO desc;         //将FormulNo 倒序后最大值取出来(这里有点错误,
                                                        就是无值时会出错
)

 if(v_value='') then                            //本意是:没有取到数据便将v_value 设为以下值。
   begin
      v_value:='WF'+to_char(sysdate,'yyyy')+'000001';    //这里可能有错,就是字符到数值转换错误
   end;
  end if;
 
 while v_i<=v_count               //设了循环,一条条数据插入,实在想不出好办法了。
    loop
      insert into PDM_Process(Pdm_processid,Laminaid,FormulaNO)
         select  sys_guid(),PDM_TobId,v_value  from  PDM_Tob   where rownum=v_i ;         
                                                         //rownum=v_i 就是为了取不同的数据
      v_i:=v_i+1;
      v_tag:=v_i;
      v_len:=LENGTH(v_tag);                              //获取v_tag的长度
      while(v_len<=(6-v_len))                            //流水号的操作,不知道有没有好方法
        loop
            v_tag:='0'+v_tag;
            v_len:=v_len+1;
       end loop;
      v_value:= 'WF'+to_char(sysdate,'yyyy')+v_tag      //同样可能会出错
   end loop;

 end P_LeafProcessSameUpdate;



请高手帮帮忙,本机没有安装ORACLE数据库无法调试  谢谢!!!
搜索更多相关主题的帖子: ORACLE 
2009-12-23 21:44
夜风敲窗
Rank: 2
等 级:论坛游民
帖 子:14
专家分:10
注 册:2008-3-3
收藏
得分:0 
create or replace procedure P_LeafProcessSameUpdate is
    v_count number(10);
    v_value varchar2(200);
    v_num   number(10);
    v_year  varchar(10);
begin

    select to_char(sysdate, 'yyyy') into v_year from dual; /*取出当前年年份*/
    select count(*) into v_count from PDM_Process;

    if v_count = 0 then
        v_num := 1; /*无值时流水号从1开始*/
    else
        select to_number(substr(MAX(FormulaNO), -6, 6))  /*取出当前年的最大FormulaNO的流水号v_num*/
        into v_num
        from PDM_Process
        where FormulaNO like '%' || v_year || '%';
    end if;

    for v in (select sys_guid() as id, PDM_TobId from PDM_Tob) loop
        v_value := 'WF' || v_year || lpad(to_char(v_num + 1), 6, '0'); /*RPAD  在列的右边粘贴字符,LPAD  在列的左边粘贴字符*/
        insert into PDM_Process
            (Pdm_processid, Laminaid, FormulaNO)
        values
            (v.id, v.PDM_TobId, v_value);
    end loop;

end P_LeafProcessSameUpdate;


没测试。。。再调整一下噢。。。

[ 本帖最后由 夜风敲窗 于 2010-1-25 17:26 编辑 ]
2010-01-25 17:24
qxl8510
Rank: 2
来 自:湖北襄樊
等 级:论坛游民
威 望:1
帖 子:43
专家分:72
注 册:2010-4-8
收藏
得分:0 
看看

晓磊
2010-05-25 16:24
快速回复:求助ORACLE存储过程,懂的进来帮助,谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011152 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved