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

问题描述 投票:1回答:1

下面我创建了一个过程,该过程采用了两个参数,分别称为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

请帮助我解决这个问题...

mysql sql select stored-procedures sql-insert
1个回答
0
投票

您似乎正在将所有记录从作为参数给出的表名复制到另一个固定表中。我认为这里不需要游标。 SQL是一种基于集合的语言,旨在以本地方式执行此类操作。您通常会使用insert into ... select ...语法。

另一方面,如果要将表名用作变量,则需要动态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 ;
© www.soinside.com 2019 - 2024. All rights reserved.