MySQL:creating 过程中动态游标
MySQL:creating cursor dynamically in procedure
下面我创建了一个过程,它采用了 2 个参数 company_name 和 SN_F,
我想将 table 名称 作为参数传递给过程,我想为其创建游标。
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
请帮我解决这个问题...
您似乎希望将作为参数给定的 table 名称中的所有记录复制到另一个固定的 table 中。我认为这里不需要光标。 SQL 是一种基于集合的语言,它是为本机执行此类操作而构建的。您通常会使用 insert into ... select ...
语法。
另一方面,如果您想使用 table 名称作为变量,则需要动态 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 ;
下面我创建了一个过程,它采用了 2 个参数 company_name 和 SN_F,
我想将 table 名称 作为参数传递给过程,我想为其创建游标。
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
请帮我解决这个问题...
您似乎希望将作为参数给定的 table 名称中的所有记录复制到另一个固定的 table 中。我认为这里不需要光标。 SQL 是一种基于集合的语言,它是为本机执行此类操作而构建的。您通常会使用 insert into ... select ...
语法。
另一方面,如果您想使用 table 名称作为变量,则需要动态 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 ;