create procedure sp_BG20090916
@datamain datetime 
as
/***************整合flow_run_data和flow_run表到指定日期的临时表中*****************/
if object_id('table_davy1') is not null                --构造table_davy1表的结构
drop table table_davy1
create table table_davy1(run_id int,item_id int, item_data varchar(500))
insert into table_davy1
select t1.*
from table_oa3 t1,table_oa2 t2
where t1.run_id=t2.run_id
and   t2.flow_id=13
and   datepart(yy,t2.begin_time)=datepart(yy,@datamain)
and   datepart(mm,t2.begin_time)=datepart(mm,@datamain) 
--and   convert(varchar(10),t2.begin_time,120)=convert(varchar(10),@datamain,120)
/********************通过游标的使用将行列进行转换*********************/
declare  cursor_t1  cursor for  select distinct run_id from table_davy1
declare @id int
declare @name varchar(30) --申请人
declare @data varchar(30)--申请日期
declare @depart varchar(30) --申请部门
declare @dpt_person varchar(30)--部门负责人
declare @things varchar(500) --申领物品
declare @note varchar(500)  --申领说明
declare @result varchar(500)--审批结果
declare @advice varchar(500) --审批意见
if object_id('table_oa') is not null                --构造table_oa表的结构
drop table table_oa
create table table_oa(
                id int,                      
                name varchar(30), --申请人
                data varchar(30), --申请日期
                depart varchar(30), --申请部门
                dpt_person varchar(30),--部门负责人
                things varchar(500), --申领物品
                note varchar(500),  --申领说明
                result varchar(500),--审批结果
                advice varchar(500) --审批意见
                ) 
OPEN   cursor_t1
FETCH NEXT FROM cursor_t1 INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
set @name='' 
set @data='' 
set @depart='' 
set @dpt_person=''
set @things='' 
set @note='' 
set @result='' 
set @advice='' 
if object_id('tempdb..#tmp') is not null          --构造临时表
drop table #tmp
select identity(int,1,1) as NewID,run_id,item_data into #tmp from table_davy1 where run_id=@id
select @name =item_data  from #tmp  where  [NewID]=1
select @data =item_data  from #tmp  where  [NewID]=2
select @depart =item_data  from #tmp  where  [NewID]=3
select @dpt_person =item_data  from #tmp  where  [NewID]=4
select @things =item_data  from #tmp  where  [NewID]=5
select @note =item_data  from #tmp  where  [NewID]=6
select @result =item_data  from #tmp  where  [NewID]=7
select @advice =item_data  from #tmp  where  [NewID]=8
drop table #tmp 
insert into table_oa 
select @id, @name,@data,@depart,@dpt_person,@things,@note,@result,@advice      --插入结果到table_oa表
update table_oa 
set  depart=(select dept_name from table_oa t1,table_department t2 where t1.depart=convert(varchar(30),t2.dept_id))
FETCH NEXT FROM   cursor_t1 INTO @id
END
close cursor_t1
deallocate cursor_t1
select * from table_oa order by id

解决方案 »

  1.   

    建议楼主先自己试着转一下。可以参考一上MYSQL的文档。
    转完后有什么不对的,或者通不过的再贴出来大家一起讨论。
      

  2.   

    我没用过mysql,我之前也试了,总是报错,我用的是5.1的mysql不会有版本不支持语句的原因的,肯定是语法不对,可却是在搞不明白
      

  3.   

    补充建表SQL语句:
    TABLE_DEPARTMENT
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TABLE_DEPARTMENT]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[TABLE_DEPARTMENT]
    GOCREATE TABLE [dbo].[TABLE_DEPARTMENT] (
    [dept_id] [int] NULL ,
    [dept_name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [tel_no] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [fax_no] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [dept_no] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [dept_parent] [int] NULL ,
    [manager] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [leader1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [leader2] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [dept_func] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TABLE_OA2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[TABLE_OA2]
    GO
    TABLE_OA2表
    CREATE TABLE [dbo].[TABLE_OA2] (
    [run_id] [int] NULL ,
    [run_name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [flow_id] [int] NULL ,
    [begin_user] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [begin_time] [datetime] NULL ,
    [end_time] [datetime] NULL ,
    [attachment_id] [int] NULL ,
    [attachment_name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [del_flag] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [focus_user] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [parent_run] [int] NULL 
    ) ON [PRIMARY]
    GO
    TABLE_OA3表
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[TABLE_OA3]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[TABLE_OA3]
    GOCREATE TABLE [dbo].[TABLE_OA3] (
    [run_id] [int] NULL ,
    [item_id] [int] NULL ,
    [item_data] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
      

  4.   

    create procedure sp_BG20090916
    (
    in i_datamain datetime 
    )
    begin
    /***************整合flow_run_data和flow_run表到指定日期的临时表中*****************/ 
    -- 构造table_davy1表的结构 
    drop table if exists table_davy1;
    create table table_davy1(run_id int,item_id int, item_data varchar(500));
    insert into table_davy1 
    select t1.* 
    from table_oa3 t1,table_oa2 t2 
    where t1.run_id=t2.run_id 
    and  t2.flow_id=13 
    and  year(t2.begin_time)=year(i_datamain) 
    and  month(t2.begin_time)=month(i_datamain);
    -- and  convert(varchar(10),t2.begin_time,120)=convert(varchar(10),i_datamain,120) 
    /********************通过游标的使用将行列进行转换*********************/
    begin
    declare v_id int;
    declare v_do int;
    declare v_name varchar(30); -- 申请人 
    declare v_data varchar(30);-- 申请日期 
    declare v_depart varchar(30); -- 申请部门 
    declare v_dpt_person varchar(30);-- 部门负责人 
    declare v_things varchar(500); -- 申领物品 
    declare v_note varchar(500);  -- 申领说明 
    declare v_result varchar(500);-- 审批结果 
    declare v_advice varchar(500); -- 审批意见 

    declare  cursor_t1  cursor for  select distinct run_id from table_davy1;
    declare continue handler for not found set v_do = 1;
    set v_do = 0;
    -- 构造table_oa表的结构 
    drop table if exists table_oa;
    create table table_oa( 
                    id int,                      
                    name varchar(30), -- 申请人 
                    data varchar(30), -- 申请日期 
                    depart varchar(30), -- 申请部门 
                    dpt_person varchar(30),-- 部门负责人 
                    things varchar(500), -- 申领物品 
                    note varchar(500),  -- 申领说明 
                    result varchar(500),-- 审批结果 
                    advice varchar(500) -- 审批意见 
                    );
    OPEN  cursor_t1;
    FETCH cursor_t1 INTO v_id;
    WHILE v_do = 0 do
    set v_name='';
    set v_data=''; 
    set v_depart=''; 
    set v_dpt_person=''; 
    set v_things=''; 
    set v_note=''; 
    set v_result=''; 
    set v_advice=''; 
    -- 构造临时表 
    drop table if exists tb_tmp;
    set @i=0;
    create temporary table tb_tmp
    as
    select @i:=@i+1 as NewID,run_id,item_data from table_davy1 where run_id=v_id;
    select  item_data into v_name from tb_tmp  where  `NewID`=1;
    select item_data into v_data  from tb_tmp  where  `NewID`=2;
    select item_data into v_depart from tb_tmp  where  `NewID`=3; 
    select item_data into v_dpt_person  from tb_tmp  where  `NewID`=4;
    select item_data into v_things from tb_tmp  where  `NewID`=5;
    select item_data into v_note  from tb_tmp  where  `NewID`=6; 
    select item_data  into v_result from tb_tmp  where  `NewID`=7;
    select item_data into v_advice from tb_tmp  where  `NewID`=8;
    drop table if exists tb_tmp;
    insert into table_oa 
    values(v_id, v_name,v_data,v_depart,v_dpt_person,v_things,v_note,v_result,v_advice);      -- 插入结果到table_oa表 
    update table_oa 
    set  depart=(select dept_name from table_oa t1,table_department t2 where t1.depart=cast(t2.dept_id as char));
    FETCH cursor_t1 INTO v_id;
    end while;
    close cursor_t1;
    select * from table_oa order by id;
    end;
    end;
      

  5.   

    回复:vinsonshen:
        在你的机器上可以正常运行吗?把你的代码复制到mysql中还是提示错误:
    [Err] 1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'procedure sp_BG20090916
    (
    in i_datamain datetime 
    )
    begin回复ACMAIN_CHM:
    我每次运行自己改的存储也是这样的错误,开始就报错,后面的就更不知道原因了。
      

  6.   

    mysql> select version();
    +----------------------+
    | version()            |
    +----------------------+
    | 5.1.36-community-log |
    +----------------------+
    1 row in set (0.02 sec)
    版本贴出来看看
      

  7.   


    你可以先从最简单的存储过程开始,然后逐步把你的代码加进去。先试一下你下面这个存储过程在你的mysql中是否能正确创建,如果可以,则你再把你的代码一条一条慢慢加进来。加到哪条不对的时候可以贴出错误信息大家一起看一下。mysql> delimiter //
    mysql>
    mysql> CREATE PROCEDURE sp_test ()
        -> BEGIN
        ->   SELECT CURDATE();
        -> END;
        -> //
    Query OK, 0 rows affected (0.34 sec)mysql>
    mysql> delimiter ;
    mysql> call sp_test();
    +------------+
    | CURDATE()  |
    +------------+
    | 2009-09-18 |
    +------------+
    1 row in set (0.03 sec)Query OK, 0 rows affected (0.03 sec)mysql>至于MYSQL的语法,概念上基本类似,具体的语法,你可以速查一下官方手册。
    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html
    20. 存储程序和函数
    20.1. 存储程序和授权表
    20.2. 存储程序的语法
    20.2.1. CREATE PROCEDURE和CREATE FUNCTION
    20.2.2. ALTER PROCEDURE和ALTER FUNCTION
    20.2.3. DROP PROCEDURE和DROP FUNCTION
    20.2.4. SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION
    20.2.5. SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS
    20.2.6. CALL语句
    20.2.7. BEGIN ... END复合语句
    20.2.8. DECLARE语句
    20.2.9. 存储程序中的变量
    20.2.10. 条件和处理程序
    20.2.11. 光标
    20.2.12. 流程控制构造
    20.3. 存储程序、函数、触发程序和复制:常见问题
    20.4. 存储子程序和触发程序的二进制日志功能