分享

游标使用:静态游标 动态游标

 闪宁斯达 2012-08-02

create or replace procedure km_document_draft_audit(
       kid_v in varchar2, mark_v in varchar2, sug_v in varchar2
) is
   click_num  integer; -- 知识点击率信息
   ver_id_current integer;  -- 草稿通过审核后的 版本号
   current_link  integer ;  --当前的环节
   last_link integer;       -- 审核流程的最终环节
   doc_num integer;    -- 正式知识表 中 是否有 已经有草稿表的信息 (kid 相同)
   doc_row  km_document%rowtype;  
   draft_row  km_document_draft%rowtype;
  
   cursor content_add is  select *   from KM_CONTENT_ADD where kid = kid_v;    --正式知识关联的 content——add
   content_k content_add%rowtype;
  
   cursor att_list is select * from KM_ATTACHMENT_LIST where  kid = kid_v;   --正式知识关联的 附件列表
   att_k  att_list%rowtype;
  
   cursor draft_node_list is select * from KM_DOCNODE_DRAFT where  kid = kid_v; --草稿节点表
   draft_node draft_node_list%rowtype;
  
   cursor  draft_content_list   is select * from KM_CONTENT_ADD_DRAFT where kid=kid_v;  --草稿内容附加信息
   draft_content draft_content_list%rowtype;
  
     cursor  draft_att_list   is select * from KM_ATTACHMENT_LIST_DRAFT where kid=kid_v;  --草稿附件
   draft_att draft_att_list%rowtype;
  
begin
 
    if  (mark_v =1)  then   --  审核通过处理   开始。。。。。。。。。
           
        select b.pass_link_id  into current_link  from  KM_DOCUMENT_DRAFT  a , KM_PROCESS_LINK   b 
            where a.audit_link =b.link_id  and a.p_id = b.pid and a.kid = kid_v;
            -- 改变审核环节   
        update KM_DOCUMENT_DRAFT k set k.audit_link = current_link  ,k.audit_sug = sug_v where k.kid = kid_v;   
           
               -- 判断当前的 审核环节是否是最终的 环节  是  进行发布, 检测当前库 是否有该知识   有 先 copy 到 历史 再删除  再将 draft 拷贝到 当前库
         select max(b.link_id) into last_link  from  KM_DOCUMENT_DRAFT  a , KM_PROCESS_LINK   b  --最大的环节
                  where a.p_id = b.pid and a.kid = kid_v;
         if(last_link = current_link)  then  --是最终的环节 进行发布操作   开始。。。。。。。。。。。            
                  ---  拷贝
                  select count(*) into doc_num  from km_document where  kid = kid_v;
                     
                  if(doc_num >0) then  --正式库有  先拷贝 到 历史库   删除正式   拷贝 draft 到正式   draf再删除 
                             --拷贝 正是知识
                             select * into doc_row  from km_document where  kid = kid_v;
                             insert into Km_Document_Ver (
                                        KID ,VER_ID,TITLE,CONTENT ,ISADDITION,STATUS,BEGINTIME,ENDTIME ,GATHERERS,GATHERTTIME ,AUDITOR ,
                                        AUDITTIME,UPDATETIME ,KEYWORDS,SUMMARY,K_SOURCE,ISADDFILE,KIND_ID )
                                values(
                                        doc_row.kid,doc_row.ver_id,doc_row.title,doc_row.content,nvl(doc_row.isaddition,0),doc_row.status,doc_row.begintime,
                                        doc_row.endtime,doc_row.gatherers,doc_row.gatherttime,doc_row.auditor,doc_row.audittime,doc_row.updatetime,
                                        doc_row.keywords,doc_row.summary,doc_row.k_source,nvl(doc_row.isaddfile,0),doc_row.kind_id
                                );                                           
                                
 
                             -- 拷贝  content——add
                              for content_k in content_add loop
                                    insert into  KM_CONTENT_ADD_VER ( KID ,VER_ID,T_ID ,CONTENT ,UPDATETIME )       
                                                    values(content_k.kid, doc_row.ver_id,content_k.t_id,content_k.content,content_k.updatetime);                                
                              end loop;
                                 
                              --- 拷贝附件表
                              for att_k in att_list loop
                                  insert into KM_ATTACHMENT_LIST_VER (
                                           KID ,VER_ID,ATTACHMENT_ID ,FILE_VER_ID ,ISDOWNLOAD,ISVIEW,
                                           SORT_NUM,DL_COUNT ,VIEW_COUNT )
                                         values (
                                              att_k.kid,att_k.ver_id,att_k.attachment_id,att_k.file_ver_id,att_k.isdownload,att_k.isview,
                                              att_k.sort_num,att_k.dl_count,att_k.view_count
                                         );                           
                                 
                              end loop;
                                 
                              --- 删除正式 关联信息 (修改 drft into 正式 删除其他的附件信息) 
                              delete from   KM_DOC_NODE where  kid = kid_v;
                              delete from   KM_CONTENT_ADD where  kid = kid_v;
                              delete from   KM_ATTACHMENT_LIST where  kid = kid_v;
                              --delete from   KM_DOCUMENT where  kid = kid_v;
                    end if;
                     
                    ---- 正式库 没有 复制 draft 到正式  
                   
                    select max(t.max_num) into  ver_id_current from (  -- 获取三表中最大的版本号 +1  为最新的版本号
                                          select  max(a.ver_id)  max_num  from km_document a  where a.kid = kid_v union all
                                          select  max(b.ver_id)  max_num   from km_document_draft b  where b.kid = kid_v union all
                                          select  max(c.ver_id)  max_num   from km_document_ver c  where c.kid = kid_v) t; 
                                                            
                    select * into draft_row  from km_document_draft where  kid = kid_v;                    
                    
                   
                    if(doc_num >0)   then ver_id_current := ver_id_current+1;
                    end if;
                    if(doc_num >0) then  ---正式表中有  进行更新  相关联的表太多
                          update    km_document  set 
                                    VER_ID = ver_id_current,TITLE = draft_row.title,CONTENT = draft_row.content ,ISADDITION =  nvl( draft_row.isaddition,0),
                                    STATUS  = 1,BEGINTIME = draft_row.begintime,ENDTIME = draft_row.endtime ,GATHERERS = draft_row.gatherers,
                                    GATHERTTIME = draft_row.gatherttime ,AUDITOR = draft_row.auditor ,AUDITTIME = draft_row.audittime,UPDATETIME = draft_row.updatetime ,
                                    KEYWORDS = draft_row.keywords,SUMMARY = draft_row.summary,K_SOURCE = draft_row.k_source,
                                    ISADDFILE = nvl(draft_row.isaddfile,0),KIND_ID = draft_row.kind_id               
                    
                                    where  kid = kid_v;             

                     else 
                       insert  into    km_document (
                               KID ,VER_ID,TITLE,CONTENT ,ISADDITION,STATUS,BEGINTIME,ENDTIME ,GATHERERS,GATHERTTIME ,AUDITOR ,
                                          AUDITTIME,UPDATETIME ,KEYWORDS,SUMMARY,K_SOURCE,ISADDFILE,KIND_ID
                               )   
                              values(
                                draft_row.kid,ver_id_current,draft_row.title,draft_row.content,nvl(draft_row.isaddition,0),1,draft_row.begintime,draft_row.endtime,
                                draft_row.gatherers,draft_row.gatherttime,draft_row.auditor,draft_row.audittime,draft_row.updatetime,draft_row.keywords,
                                draft_row.summary,draft_row.k_source,nvl(draft_row.isaddfile,0),draft_row.kind_id
                              ) ;
                       --  点击率统计 初始化
                       select count(1) into click_num from  RP_DOC_CLICK_SUM where kid = kid_v;
                       if(click_num < 1) then
                                     insert into RP_DOC_CLICK_SUM (kid,view_count,fav_count) values (kid_v,0,0);
                       end if;
                     end if ;      
                           
                           
                    --  复制node节点
                    for  draft_node in draft_node_list loop
                      
                       insert into KM_DOC_NODE ( KID ,TREE_ID ,NODE_ID ,VER_ID)
                              values(draft_node.kid,draft_node.tree_id,draft_node.node_id,ver_id_current);            
                    end loop;
                  
             -- 复制 KM_CONTENT_ADD_DRAFT
                    for draft_content in draft_content_list loop
                        insert into KM_CONTENT_ADD (KID,T_ID ,CONTENT,UPDATETIME )
                               values (draft_content.kid,draft_content.t_id,draft_content.content,draft_content.updatetime);
                    end loop;
                     -- 复制 KM_KM_ATTACHMENT_LIST_DRAFT
                    for draft_att in draft_att_list loop             
                        insert  into KM_ATTACHMENT_LIST (      ATTACHMENT_ID ,KID ,FILE_VER_ID ,ISDOWNLOAD,ISVIEW,
                                                                      SORT_NUM,DL_COUNT,VIEW_COUNT,VER_ID)
                                values (draft_att.attachment_id,draft_att.kid,draft_att.file_ver_id,draft_att.isdownload,draft_att.isview,
                                       draft_att.sort_num,draft_att.dl_count,draft_att.view_count,ver_id_current);
                    end loop;
                         
                    --- 复制完毕 删除 draft 以及相关联的表
                         
                    delete from   KM_DOCNODE_DRAFT where  kid = kid_v;
                    delete from   KM_CONTENT_ADD_DRAFT where  kid = kid_v;
                    delete from   KM_ATTACHMENT_LIST_DRAFT where  kid = kid_v;
                    delete from   KM_DOCUMENT_DRAFT where  kid = kid_v;              
                               
                   
         end if ;  --是最终的环节 进行发布操作   结束。。。。。。。。。。。            
           
    end if; --  审核通过处理   结束。。。。。。。。。
        
    if (mark_v=0)   then  -- 审核未通过  处理  开始。。。。
        select min(b.link_id)   into current_link  from  KM_DOCUMENT_DRAFT  a , KM_PROCESS_LINK   b 
               where  a.p_id = b.pid and a.kid = kid_v;
               -- 改变审核环节   
        update KM_DOCUMENT_DRAFT k set k.audit_link = current_link  ,k.audit_sug = sug_v ,k.edit_status=4 where k.kid = kid_v; 
    
     end if;  -- 审核未通过  处理  结束。。。。

   
 
   commit;  
/*
 exception
     when others then
           dbms_output.put_line(': 异常了');
           rollback; 
*/
 
  end;
 

**************************************************************************************************************************************
 create or replace procedure UPDATE_NODE_TREE_MOVE_HASAU(v_treeId in integer,
       v_sourceId in integer, v_targetId in integer,  v_pId in integer,
    v_moveType in varchar2, v_sameLevel in  integer
)   is
type cur_type is ref cursor;
sameLevel_cursor cur_type;  --同级别的游标(存node_Id)
node_item  km_tree_node%rowtype; 

sortNum_s  integer;  -- 源的
sortNum_t  integer;  -- 目标
 

begin
  
     if('inner'= v_moveType)  then  -- 变成子节点   ,source 父id  改为tagert的 node_id
                      
                 select nvl(max(sort_num),0)+1 into sortNum_s from km_tree_node where  parent_id = v_targetId ;
                 update km_tree_node t set t.parent_id = v_targetId ,t.sort_num = sortNum_s   where t.node_id = v_sourceId ;
     else            
        --  同级别之间移动
          if(v_sameLevel = 1)  then 
                select sort_num into sortNum_s   from km_tree_node  where node_id = v_sourceId ;-- 源
                select sort_num into sortNum_t   from km_tree_node  where node_id = v_targetId ;-- 目标
                  
                 if('prev'= v_moveType)  then --同级的节点移动  前面  目标节点 向下 移动 为源节点留出位置
                      
                       --  源节点 在下方    移动到 目标节点的前边  
                       if(sortNum_s > sortNum_t) then   
                              --  源节点与 目标节点的之间的 节点 (包括目标 不包括源) 
                              open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
                                            and t.sort_num >=sortNum_t  and t.sort_num < sortNum_s  order by t.sort_num asc;
                                                
                              
                              -- 再将所有的节点同时  向下  移动1格 sort_num +1
                              loop
                                   fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
                                   EXIT WHEN sameLevel_cursor%notfound;
                                   update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id ;
                              end loop;
                               --  将源节点 移到 目标节点 原先的 位置
                              update km_tree_node set sort_num = sortNum_t where node_id = v_sourceId;
                      
                       end if;
                
                         --  源节点 在上方   移动到 目标节点的后边  
                       if(sortNum_s < sortNum_t) then   
                              --  源节点与 目标节点的之间的 节点 (包括目标 不包括源)
                              open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
                                            and t.sort_num >sortNum_s  and t.sort_num < sortNum_t ;
                                                
                              
                              -- 再将所有的节点同时  向上  移动1格  sort_num -1
                              loop
                                   fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
                                   EXIT WHEN sameLevel_cursor%notfound;
                                   update km_tree_node set sort_num = sort_num-1 where node_id = node_item.node_id ;
                              end loop;
                               --  将源节点 移到 目标节点 原先的 位置
                              update km_tree_node set sort_num = sortNum_t-1 where node_id = v_sourceId;
                      
                       end if;
                 elsif('next'= v_moveType)  then --同级的节点移动  后面 目标节点  不动
                        --  源节点 在下方    移动到 目标节点的前边  
                       if(sortNum_s > sortNum_t) then   
                              --  源节点与 目标节点的之间的 节点 (不包括边界)
                              open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
                                            and t.sort_num >sortNum_t  and t.sort_num < sortNum_s  ;
                                                
                              
                              -- 再将所有的节点同时  向下  移动1格 sort_num +1
                              loop
                                   fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
                                   EXIT WHEN sameLevel_cursor%notfound;
                                   update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id ;
                              end loop;
                               --  将源节点 移到 目标节点 位置下方  目标sort_num-1
                              update km_tree_node set sort_num = sortNum_t+1 where node_id = v_sourceId;
                      
                       end if;
                
                         --  源节点 在上方   移动到 目标节点的后边  
                       if(sortNum_s < sortNum_t) then   
                              --  源节点与 目标节点的之间的 节点 不包括边界)
                              open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
                                            and t.sort_num >sortNum_s  and t.sort_num < sortNum_t  ;
                                                
                              
                              -- 再将所有的节点同时  向上  移动1格  sort_num -1
                              loop
                                   fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
                                   EXIT WHEN sameLevel_cursor%notfound;
                                   update km_tree_node set sort_num = sort_num-1 where node_id = node_item.node_id ;
                              end loop;
                               --  将源节点 移到 目标节点 位置下方  目标sort_num-1
                              update km_tree_node set sort_num = sortNum_t+1 where node_id = v_sourceId;
                      
                       end if; 
                 end if;
        
          --  非同级别 移动 (前 后)  
          else  
              if('prev'= v_moveType)  then
                    --  目标的sortnum 为 源最终的sort num  (目标与其他的节点下移1格)
                    select sort_num into sortNum_s from km_tree_node where node_id = v_targetId ;
                    ---包括目标节点 都要下移1格
                    open  sameLevel_cursor  for select t.node_id from km_tree_node t where t.tree_id=  v_treeId
                          and t.parent_id = v_pId   and t.sort_num >=  sortNum_s; 
                    loop
                          fetch sameLevel_cursor into node_item.node_id ;
                          EXIT WHEN sameLevel_cursor%notfound;
                          update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id;
                    end loop;
                    --  源节点 放到 目标节点的位置(目标节点已经下移1格)     
                    update km_tree_node set sort_num = sortNum_s , parent_id = v_pId where node_id =v_sourceId ;
                   
              end if;
              if('next'= v_moveType)  then
                     select sort_num into sortNum_s from km_tree_node where node_id = v_targetId ;
                     -- 不包括目标节点  下移1格
                     open  sameLevel_cursor  for select t.node_id from km_tree_node t where t.tree_id=  v_treeId
                          and t.parent_id = v_pId   and t.sort_num >  sortNum_s; 
                     loop
                          fetch sameLevel_cursor into node_item.node_id ;
                          EXIT WHEN sameLevel_cursor%notfound;
                          update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id;
                    end loop;
                    -- +1 放在目标节点的下方
                    update km_tree_node set sort_num = sortNum_s+1 , parent_id = v_pId where node_id =v_sourceId ;
              end if;
          end if ;

    end if;
    commit;
end;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多