提问者:小点点

MySQL:在过程中动态创建游标


下面我创建了一个过程,该过程包含两个名为company_name和SN_F的参数,

我想把表名作为参数传递给过程,我想为它创建游标。

DELIMITER //
CREATE PROCEDURE transfer_t(IN company_name varchar(50), SN_f int)
BEGIN


DECLARE done BOOLEAN DEFAULT 0;
DECLARE dates_f date default null;
DECLARE high_f float default 0.0;
DECLARE low_f float default 0.0;
DECLARE open_f float default 0.0;
DECLARE close_f float default 0.0;
DECLARE volume_f int default 0;
DECLARE adj_close_f float default 0.0;



DECLARE Company_detail cursor for 
    select Date, high, low, open, close, volume, adj_close from company_name;
    Declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
    OPEN Company_detail;
    REPEAT
        FETCH company_detail into dates_f, high_f, low_f, open_f, close_f, volume_f, adj_close_f;

        insert into historic_data(sn ,Date ,High ,low ,open ,close , volume , adj_close) values (SN_f,dates_f,high_f,low_f,open_f,close_f, volume_f, adj_close_f);

        until done END REPEAT;
        close company_detail;


END//
DELIMITER ;

成功创建了上面的过程,但是每当我调用它时,

call transfer_t('tcs_temp', 1);

它会给出以下错误

Error Code: 1146. Table 'test_schema.company_name' doesn't exist

请帮我解决这个。。。


共1个答案

匿名用户

您似乎希望将所有记录从作为参数给定的表名复制到另一个固定的表中。 我看不出这里需要光标。 SQL是一种基于集合的语言,它是为执行此类操作而构建的。 通常使用插入到。。。选择。。。语法。

另一方面,如果您想使用表名作为变量,则需要动态SQL--您当前的代码缺少这个变量。

下面的代码应该执行您想要的操作:

delimiter //

create procedure transfer_t(in p_company_name varchar(50), p_sn_f int)
begin
    set @p_sn_f = p_sn_f;
    set @sql = concat(
        'insert into historic_data(sn ,Date ,High ,low ,open ,close , volume , adj_close)',
        ' select ?, date, high, low, open, close, volume, adj_close from ', p_company_name
    );

    prepare stmt from @sql;
    execute stmt using @p_sn_f;
    deallocate prepare stmt;
end//

delimiter ;